美文网首页
7.从零搭建WebApi接口开发框架-请求参数校验

7.从零搭建WebApi接口开发框架-请求参数校验

作者: 孔垂云 | 来源:发表于2017-12-25 00:14 被阅读0次

日常开发中,前端会对请求参数进行校验,为了保证请求参数的格式正确,也需要在服务端做参数校验。
服务端参数校验用的是Hibernate-validator框架,利用简单注解实现。

实体类增加校验注解

这里以登录为例进行说明:

public class LoginDto {
    @NotNull
    private String username;//账号
    @NotNull
    @Length(min = 6, message = "密码格式错误")
    private String password;//密码
//set get省略

}

这一块用的注解来实现,比较简单,具体注解的使用说明如下:

| @Null | 被注释的元素必须为 null |
| @NotNull | 被注释的元素必须不为 null |
| @AssertTrue | 被注释的元素必须为 true |
| @AssertFalse | 被注释的元素必须为 false |
| @Min(value) | 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 |
| @Max(value) | 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 |
| @DecimalMin(value) | 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 |
| @DecimalMax(value) | 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 |
| @Size(max, min) | 被注释的元素的大小必须在指定的范围内 |
| @Digits (integer, fraction) | 被注释的元素必须是一个数字,其值必须在可接受的范围内 |
| @Past | 被注释的元素必须是一个过去的日期 |
| @Future | 被注释的元素必须是一个将来的日期 |
| @Pattern(value) | 被注释的元素必须符合指定的正则表达式 |

2. Hibernate Validator 附加的 constraint

| @Email | 被注释的元素必须是电子邮箱地址 |
| @Length(min=, max=)
| 被注释的字符串的大小必须在指定的范围内 |
| @NotEmpty | 被注释的字符串的必须非空 |
| @Range(min=, max=) | 被注释的元素必须在合适的范围内 |
| @NotBlank|被注释的字符串的必须非空|

controller增加@valid注解
在需要校验的请求controller方法中,增加@valid注解,校验要获取的对象字段,如下图:


@valid注解.png

在controllerAdvice中增加参数校验异常的统一拦截

 /**
     * 拦截@Valid请求参数验证不通过的异常
     *
     * @param request   request
     * @param response  response
     * @param exception 验证不通过的异常
     * @return 执行结果
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ResponseBody
    @Order(0)
    public JsonResult handler(HttpServletRequest request, HttpServletResponse response, MethodArgumentNotValidException exception) {
        logger.info("请求的参数不正确", exception);
        logException(request);
        String validation_message;
        BindingResult bindingResult = exception.getBindingResult();
        if (bindingResult != null && bindingResult.getFieldError() != null) {
            validation_message = bindingResult.getFieldError().getDefaultMessage();
        } else {
            validation_message = exception.getMessage();
        }
        logger.info("参数错误信息:" + validation_message);
        return new JsonResult(false, GlobalReturnCode.PARAM_ERROR, validation_message);
    }

这里有个@Order(0)注解,参数校验首先进行做,后续再做默认系统异常拦截。比如校验失败提示如下图:

格式校验.png

格式校验比较简单,但是生产项目中必不可少,防范外部攻击的主要手段之一。

源码下载

本例子详细源码

相关文章

网友评论

      本文标题:7.从零搭建WebApi接口开发框架-请求参数校验

      本文链接:https://www.haomeiwen.com/subject/tyhtixtx.html