BindingResult 穿越校验 合并统一异常拦截校验

问题场景:      

         项目前后端对接时,前端调用服务端接口进行入参校验时,服务器和浏览器需要进行双向校验。在统一传参对象时,需要对一些入参字段进行判空,判长度,格式校验

第一种方案可以直接在对象实体的字段上使用相应注解

相关的校验API:
空检查
@NotEmpty:用在集合类上面;不能为null,而且长度必须大于0
@NotBlank: 用在String上面;只能作用在String上,不能为null,而且调用trim()后,长度必须大于0
@NotNull:用在基本类型上;不能为null,但可以为empty。

长度检查
@Size(min=,max=):验证对象(Array,Collection,Map,String)长度是否在给定的范围之内
不要错用了异常类型,比如在int上不可用@size
@Length(min=, max=) : 只适用于String 类型

Booelan检查
@AssertTrue: 验证 Boolean 对象是否为 true
@AssertFalse: 验证 Boolean 对象是否为 false

日期检查
@Past: 验证 Date 和 Calendar 对象是否在当前时间之前
@Future: 验证 Date 和 Calendar 对象是否在当前时间之后
@Pattern: 验证 String 对象是否符合正则表达式的规则

其他验证:
@Vaild 递归验证,用于对象、数组和集合,会对对象的元素、数组的元素进行一一校验
@Email 用于验证一个字符串是否是一个合法的右键地址,空字符串或null算验证通过
@URL(protocol=,host=,port=,regexp=,flags=) 用于校验一个字符串是否是合法URL

第二种方案,如果入参比较少,也可直接取参数进行if else 判断,并对异常参数进行return 异常提示,这种直白的方式,在多代码编写时,费事费力,不推荐
第三种方案,也是比较建议的方式,在服务端接口传参处使用BindingResult

        BindingResult是Spring框架中的一个核心接口,用于处理数据校验的结果,确保数据的合法性,BindingResult需要配合校验器Validator一起使用,在传入的对象前使用@Valid

public GraceJSONResult saveOrUpdate(@Valid SaveBO saveBO,BindingResult result) {
// 判断BindingResult是否保存错误的验证信息,如果有,则直接return
       if (result.hasErrors()) {
           Map<String, String> errorMap = getErrors(result);
           return GraceJSONResult.errorMap(errorMap);
       }
}

如果入参没有按要求传,就可以统一返回异常,如下

方案优化:
使用BindingResult可以极大省去前后端参数的校验,但像上面每个对接的服务端接口都要判断BindingResult里是否存在错误验证信息并返回,代码还是太冗余,所以进行进一步封装,将该机制放到整个服务端的统一异常拦截器里。

        Spring提供了一个方法参数校验的异常类MethodArgumentNotValidException ,它会在所有接口接收前先进行拦截校验,如下


/**
 * 统一异常拦截处理
 * 可以针对异常的类型进行捕获,然后返回json信息到前端
 */
@ControllerAdvice
public class GraceExceptionHandler {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseBody
    public GraceJSONResult returnException(MethodArgumentNotValidException e) {
        BindingResult result = e.getBindingResult();
        Map<String, String> errors = getErrors(result);
        return GraceJSONResult.errorMap(errors);
    }

    public Map<String, String> getErrors(BindingResult result) {
        Map<String, String> map = new HashMap<>();
        List<FieldError> errorList = result.getFieldErrors();
        for (FieldError fieldError : errorList) {
            String field = fieldError.getField();
            String defaultMessage = fieldError.getDefaultMessage();
            map.put(field, defaultMessage);
        }
        return map;
    }
}

 使用统一的异常拦截后,服务端的接口参数校验就不需要每个接口都配置,依然可以实现验证效果,主打一个实现功能的前提下,能少写代码就少写,能不写就不写。

end

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot拦截器是一种用于在请求到达目标方法之前或之后执行一些操作的机制。在实现登录校验时,可以使用拦截器来拦截请求,并进行登录状态的验证。 首先,需要编写一个拦截器类来实现登录校验的逻辑。拦截器类需要继承HandlerInterceptorAdapter,并重写preHandle方法。在preHandle方法中,可以获取到请求的信息,如请求路径和参数。根据业务需要,可以从请求中获取登录状态信息,进行验证。 其次,需要配置拦截器类生效的路径。在Spring Boot中,可以通过配置类或注解来配置拦截器类。可以使用@Configuration注解标注一个配置类,并通过implements WebMvcConfigurer接口来添加拦截器。 在配置类中,可以通过重写addInterceptors方法来配置拦截器。将拦截器对象添加到InterceptorRegistry中,并设置拦截的路径。可以使用addPathPatterns方法来设置拦截的路径模式,如"/user/*"表示拦截以/user/开头的路径。 在拦截器生效后,当发起请求时,拦截器会拦截请求并调用preHandle方法进行登录校验。如果登录状态验证失败,可以根据业务需要进行处理,如返回错误信息或进行重定向。 需要注意的是,拦截拦截的是请求,而不是方法。也就是说,拦截器会在请求到达目标方法之前执行,但不会影响目标方法的执行。如果需要在拦截器中进行一些后续操作,可以使用postHandle和afterCompletion方法。 通过使用Spring Boot拦截器来校验登录,可以在请求到达目标方法之前进行登录状态的验证,确保只有已登录的用户才能访问敏感接口或页面,提高系统的安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值