2019独角兽企业重金招聘Python工程师标准>>>

前言:

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

解决:

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

实现:

maven依赖:

    <properties><hibernate-version>4.3.1.Final</hibernate-version><spring-version>4.3.7.RELEASE</spring-version><jackson-version>2.7.4</jackson-version></properties><dependencies><!--Hibernate注解--><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>${hibernate-version}</version></dependency><!--Spring--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring-version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>${spring-version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${spring-version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring-version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>${spring-version}</version></dependency><!--支持@ResponseBody注解返回Json--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>${jackson-version}</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>${jackson-version}</version></dependency></dependencies>

实体类:

/*** 功能描述:用户实体类** @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:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><context:component-scan base-package="com.menghao.validator.controller"/><mvc:annotation-driven validator="validator" /><bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"><property name="providerClass" value="org.hibernate.validator.HibernateValidator"/></bean>
</beans>

场景——Js对象请求:

controller:

/*** 功能描述:UserController** @author menghao* @date 2017/8/30*/
@Controller
@RequestMapping("user")
public class UserController {@PostMapping@ResponseBodypublic Result user(@Validated User user, BindingResult bindingResult) {if (bindingResult.hasErrors()) {List<String> errMsg = new ArrayList<String>(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@ResponseBodypublic Result user(@RequestBody @Validated User user) {return new Result(true, "参数正确");}/*** 当Controller中方法抛出异常时会进入该方法** @param e 捕获异常* @return Result 校验信息*/@ExceptionHandler(MethodArgumentNotValidException.class)@ResponseBodypublic Result catchException(MethodArgumentNotValidException e) {BindingResult bindingResult = e.getBindingResult();List<String> errMsg = new ArrayList<String>(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

SpringMVC + Hibernate-Validator 参数校验相关推荐

  1. SpringBoot中的Validator参数校验器——通过注解的方式控制controler接收参数的规则

    前言 在日常的接口开发中,经常要对接口的参数做校验,例如,登录的时候要校验用户名密码是否为空.但是这种日常的接口参数校验太烦锁了,代码繁琐又多. Validator框架就是为了解决开发人员在开发的时候 ...

  2. SpringBoot 2 快速整合 | Hibernate Validator 数据校验

    概述 在开发RESTFull API 和普通的表单提交都需要对用户提交的数据进行校验,例如:用户姓名不能为空,年龄必须大于0 等等.这里我们主要说的是后台的校验,在 SpringBoot 中我们可以通 ...

  3. golang validator参数校验 中文

    今天在改后台页面,参数校验错误时输出全是英文,使用着很难看懂到底时什么错了 故而决定去做i18n前端国际化. 改的时候踩了很多坑,故而记录一下,顺便记录以下查问题的方式. 效果 从原来的Title i ...

  4. python cerberus Validator参数校验

    最简单用法 # 最简单用法 from cerberus import Validator schema = {'name1': {'type': 'string'}, 'name2': {'type' ...

  5. Iris——整合go-playground/validator参数校验Demo

    源代码:https://gitee.com/shentuzhigang/mini-project/blob/master/iris_validator 解决方案 go.mod require (git ...

  6. Validator 参数校验springboot整合Validator,自定义手机号参数校验

    https://blog.csdn.net/m0_46425463/article/details/108006414

  7. Java代码简洁-validation参数校验

    validation参数校验 bean validation和hibernate validator参数校验 常用注解 1.导入依赖 2.测试 3.自定义消息模板 4.分组校验 5.级联校验 6.自定 ...

  8. Spring Validation最佳实践及其实现原理,参数校验没那么简单!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:六点半起床 juejin.im/post/685654110 ...

  9. Spring Validation 最佳实践及其实现原理,参数校验没那么简单!

    之前也写过一篇关于Spring Validation使用的文章,不过自我感觉还是浮于表面,本次打算彻底搞懂Spring Validation.本文会详细介绍Spring Validation各种场景下 ...

最新文章

  1. python拼写检查_拼写检查 - Python文本处理教程™
  2. 简书非官方大数据(一)
  3. 梯度下降,损失函数-讲的很好
  4. Shared pool内存块组成结构及4031错误原因分析
  5. Qt CMake变量参考
  6. 云计算基础介绍,比喻小理解!
  7. springboot+springcloud相关问题
  8. 后端Coder如何做好代码设计?
  9. 简单的解释,让你秒懂“最优化” 问题
  10. 分治法在求解“最近对”问题中的应用(JAVA)
  11. 斜挎包长度到哪里合适_斜挎包带子多长合适 看个人身高
  12. 面进了心心念念的国企!以为TM上岸了!干了1年!我却再次选择回到互联网大厂内卷!...
  13. 想了解表格问答,我们先看看TA的前世
  14. Linux下的python.......安装
  15. vs2012中EF6的BUG
  16. 这不是海市蜃楼,这是平地雾
  17. 计算机存储数据时2的20次方,2的20次方是多少
  18. 修改scrollbars的样式
  19. 2021年,交通·未来系列线上公益学术活动重新起航~
  20. python删除第一行_python学习之删除DataFrame某一行/列内容

热门文章

  1. mysql日志文件相关的配置【2】
  2. lamp-安装脚本-修订版2
  3. cinder存储服务
  4. Lumen / Laravel 5.5 使用网易邮箱 SMTP 发送邮件
  5. 附录G Netty与NettyUtils
  6. 产品经理如何做好数据埋点
  7. 《Java 开发从入门到精通》—— 2.2 编写第一段Java程序
  8. lnmp上搭建zabbix
  9. matlab 降维工具箱
  10. cpp中sizeof与指针