博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringMVC + Hibernate-Validator 参数校验
阅读量:6983 次
发布时间:2019-06-27

本文共 4732 字,大约阅读时间需要 15 分钟。

hot3.png

前言:

    Web开发中,最为常见的场景就是前端表单数据、Json数据与后端实体类的绑定,即使JS能校验并阻止大部分的必填漏填的风险,但并不能防止恶意破坏者修改脚本。因此后端参数校验必不可少,但如果针对每一个请求都写硬代码校验,必然会增加许多重复、冗长的代码。

 

解决:

    使用SpringMVC + Hibernate-Validator 进行参数校验,并反馈校验信息给前端。

 

实现:

maven依赖:

4.3.1.Final
4.3.7.RELEASE
2.7.4
org.hibernate
hibernate-validator
${hibernate-version}
org.springframework
spring-context
${spring-version}
org.springframework
spring-beans
${spring-version}
org.springframework
spring-core
${spring-version}
org.springframework
spring-webmvc
${spring-version}
org.springframework
spring-web
${spring-version}
com.fasterxml.jackson.core
jackson-databind
${jackson-version}
com.fasterxml.jackson.core
jackson-core
${jackson-version}

实体类:

/** * 功能描述:用户实体类 * * @author menghao * @date 2017/8/30 */public class User {    @NotBlank(message = "用户名必填")    private String name;    @NotNull(message = "年龄必填")    private Integer age;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public Integer getAge() {        return age;    }    public void setAge(Integer age) {        this.age = age;    }}

spring-mvc.xml:

 

场景——Js对象请求:

controller:

/** * 功能描述:UserController * * @author menghao * @date 2017/8/30 */@Controller@RequestMapping("user")public class UserController {    @PostMapping    @ResponseBody    public Result user(@Validated User user, BindingResult bindingResult) {        if (bindingResult.hasErrors()) {            List
errMsg = new ArrayList
(bindingResult.getFieldErrorCount()); for (FieldError error : bindingResult.getFieldErrors()) { errMsg.add(error.getDefaultMessage()); } return new Result(false, errMsg); } return new Result(true, "参数正确"); }}

测试结果:

//请求var param = {    name : "11",    age : 11};$.ajax({    url : '/user',    data : param,    type : 'POST'});//响应{    "success": true,     "data": "参数正确"}//请求$.ajax({    url : '/user',    type : 'POST'});//响应{    "success": false,     "data": [        "用户名必填",         "年龄必填"    ]}

 

场景——Json格式请求:

controller:

/** * 功能描述:UserController * * @author menghao * @date 2017/8/30 */@Controller@RequestMapping("user")public class UserController {    @PostMapping    @ResponseBody    public Result user(@RequestBody @Validated User user) {        return new Result(true, "参数正确");    }    /**     * 当Controller中方法抛出异常时会进入该方法     *     * @param e 捕获异常     * @return Result 校验信息     */    @ExceptionHandler(MethodArgumentNotValidException.class)    @ResponseBody    public Result catchException(MethodArgumentNotValidException e) {        BindingResult bindingResult = e.getBindingResult();        List
errMsg = new ArrayList
(bindingResult.getFieldErrorCount()); for (FieldError error : bindingResult.getFieldErrors()) { errMsg.add(error.getDefaultMessage()); } return new Result(false, errMsg); } }

测试结果:

//请求{	"name" : "menghao"}//响应{    "success": false,    "data": [        "年龄必填"    ]}//请求{	"name" : "menghao",	"age" : 22}//响应{    "success": true,    "data": "参数正确"}

 

总结:

    如果请求参数为Json格式,需要对参数添加@RequestBody,否则无法将数据绑定到对象(值为null)。因此如果继续使用  @Validated User user, BindingResult bindingResult  ,会造成请求失败,无法进入对应方法。

    但是仍然需要返回校验信息的话,就需要采用异常处理的方式了。在参数校验失败时会抛出MethodArgumentNotValidException异常,这里采用了@ExceptionHandler来处理。其他常用的处理方式还有:

    <1>实现HandlerExceptionResolver类,在resolveException方法中处理逻辑,不过局限在于返回的类型为ModelAndView。

    <2>自定义类,使用@controlleradvice注解标记类,并自定义方法来处理捕获异常逻辑,仍然使用@ExceptionHandler注解来标记方法,并在注解value属性中指明捕获的异常类型。

转载于:https://my.oschina.net/marvelcode/blog/1526294

你可能感兴趣的文章
Sqlserver2005手动备份远程数据库到本地数据库方法
查看>>
0406复利计算5.0
查看>>
服装分销
查看>>
如何理解数学期望[转载]
查看>>
WAMP Server 和IIS 7如何在Windows中同时运行
查看>>
第四篇、点赞的粒子动画
查看>>
linux 搭建lamp环境
查看>>
WP7应用版本升级的实现方法
查看>>
Vue组件间的参数传递
查看>>
Css文件目录结构
查看>>
laravel中Blade模板继承
查看>>
POJ 2231 Moo Volume
查看>>
20061025: 用上了 ClearType 字体
查看>>
20单位均线,是交易的生命线。
查看>>
Merge Two Sorted Lists
查看>>
黑盒测试用例编写规范(一)
查看>>
EAI Bridges简介
查看>>
checkbox全选/全不选,子复选框全选父复选框选中
查看>>
12.2第一周总结
查看>>
nginx-2-nginx的反向代理
查看>>