栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > Web开发 > JavaScript

Controller 层参数校验方案

JavaScript 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Controller 层参数校验方案

思路

Controller层有两种校验场景

  1. 单个参数的校验

// 用户登录 Controller 方法@PostMapping("/login")public Message login(String verifyCode,String account,String password){  //....       
  return null;
}
  1. 实体类的校验
    实体类User里,有多个字段需要校验,比如用户名不能为空,密码不能为空等等

// 添加用户 Controller 方法@PostMapping("/add")public Message addUser(User user){  //....       
  return null;
}


下面介绍GET参数校验的实现方法。

环境

注意,Spring boot 内已经集成了Hibernate validator

  • Spring boot

  • Hibernate validator

  • lombok

Hibernate 参数校验 - GET参数校验模式 的实现
  • 编写配置类

package com.spz.demo.security.config;import lombok.extern.slf4j.Slf4j;import org.hibernate.validator.Hibernatevalidator;import org.springframework.boot.autoconfigure.EnableAutoConfiguration;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.validation.beanvalidation.MethodValidationPostProcessor;import javax.validation.Validation;import javax.validation.Validator;import javax.validation.ValidatorFactory;@Slf4j(topic = "SYSTEM_LOG")//日志模块@Configuration@EnableAutoConfigurationpublic class ValidatorConfig {    @Bean
    public MethodValidationPostProcessor methodValidationPostProcessor() {
        MethodValidationPostProcessor postProcessor = new MethodValidationPostProcessor();
        postProcessor.setValidator(validator());//快速校验,只要有错马上返回
        return postProcessor;
    }    @Bean
    public Validator validator(){
        ValidatorFactory validatorFactory = Validation.byProvider( Hibernatevalidator.class )
                .configure()
                .addProperty( "hibernate.validator.fail_fast", "true" )
                .buildValidatorFactory();
        Validator validator = validatorFactory.getValidator();        return validator;
    }

}
  • 编写验证错误信息提示
    校验未通过时,将抛出ConstraintViolationException异常,此时需要在异常处理方法里获取错误信息,并进行返回

package com.spz.demo.security.config;import com.spz.demo.security.bean.Message;import org.springframework.http.HttpStatus;import org.springframework.stereotype.Component;import org.springframework.web.bind.annotation.ControllerAdvice;import org.springframework.web.bind.annotation.ExceptionHandler;import org.springframework.web.bind.annotation.ResponseBody;import org.springframework.web.bind.annotation.ResponseStatus;import javax.validation.ConstraintViolation;import javax.validation.ConstraintViolationException;import javax.validation.ValidationException;import java.util.Set;@ControllerAdvice@Componentpublic class GlobalExceptionHandler {    
    @ExceptionHandler
    @ResponseBody
    @ResponseStatus(HttpStatus.BAD_REQUEST)    public Object handle(ValidationException exception) {
        String errorInfo = "";        if(exception instanceof ConstraintViolationException){
            ConstraintViolationException exs = (ConstraintViolationException) exception;

            Set> violations = exs.getConstraintViolations();            for (ConstraintViolation item : violations) {
                errorInfo = errorInfo + "[" + item.getMessage() + "]";
            }
        }        return new Message().setErrorMessage(errorInfo);
    }
}
  • Message类是包装请求返回,一般在Controller层使用,用于返回json格式数据

package com.spz.demo.security.bean;import com.fasterxml.jackson.annotation.JsonInclude;import com.spz.demo.security.common.MessageCode;import lombok.Data;import java.io.Serializable;import java.util.HashMap;import java.util.Map;@Data@JsonInclude(JsonInclude.Include.NON_NULL)public class Message implements Serializable {    private int code ;    private String message ;    private Map data = new HashMap();    
    public Message setMessage(int code, String message){        this.code = code;        this.message = message;        return this;
    }    
    public Message setSuccessMessage(){        this.code = MessageCode.SUCCESS ;        this.message = "操作成功" ;        return this;
    }    
    public Message setSuccessMessage(String message){        this.code = MessageCode.SUCCESS ;        this.message = message ;        return this;
    }    
    public Message setErrorMessage(String message){        this.code = MessageCode.ERROR ;        this.message = message ;        return this;
    }    
    public Message setWarnMessage(String message){        this.code = MessageCode.WARN ;        this.message = message ;        return this;
    }    
    public Message setNoLoginMessage(String message){        this.code = MessageCode.NO_LOGIN ;        this.message = message ;        return this;
    }    
    public Message setPermissionDeniedMessage(String message){        this.code = MessageCode.PERMISSION_DENIED ;        this.message = message ;        return this;
    }
}
  • Controller 层使用校验

package com.spz.demo.security.controller;import com.spz.demo.security.bean.Message;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.redis.core.StringRedisTemplate;import org.springframework.validation.annotation.Validated;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import javax.validation.constraints.NotEmpty;@Slf4j(topic = "USER_LOG")@RestController@RequestMapping("/user")@Validated//需要使用Hibernate非实体类参数校验,需要加入此注解public class UserController {    @Autowired
    StringRedisTemplate redis;    
    @PostMapping("/login")    public Message login(@NotEmpty(message = "账号不能为空") String account,
                         @NotEmpty(message = "密码不能为空") String password,
                         @NotEmpty(message = "验证码不能为空") String verifyCode){        //....
        return new Message().setSuccessMessage();
    }

}

使用时,发送用户登录请求,如果参数校验失败,将返回错误信息:

{  "code": 5000,  "message": "[验证码不能为空]",  "data": { }
}



作者:萌璐琉璃
链接:https://www.jianshu.com/p/aa8b3163b30a


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/245815.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号