1、Spring mvc 的表单验证
客户端表单验证:代码写在js上,容易被攻击。
服务端表单验证 :不容易被攻击,它是在后台进行验证就不会被人恶意攻击,不容易被人随意登陆其他的信息或者窃取他人信息。

如果使用需要JSR303 ,就要导入hibernate-validator依赖

<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>5.0.2.Final</version></dependency>

2、校验框架介绍
JSR303 是一套JavaBean参数校验的标准,它定义了很多常用的校验注解,我们可以直接将这些注解加在我们JavaBean的属性上面,就可以在需要校验的时候进行校验了。注解如下:
参考配置
@Null 限制只能为null
@NotNull 限制必须不为null
@AssertFalse 限制必须为false
@AssertTrue 限制必须为true
@DecimalMax(value) 限制必须为一个不大于指定值的数字
@DecimalMin(value) 限制必须为一个不小于指定值的数字
@Digits(integer,fraction) 限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction
@Future 限制必须是一个将来的日期
@Max(value) 限制必须为一个不大于指定值的数字
@Min(value) 限制必须为一个不小于指定值的数字
@Past 限制必须是一个过去的日期
@Pattern(value) 限制必须符合指定的正则表达式
@Size(max,min) 限制字符长度必须在min到max之间
@Past 验证注解的元素值(日期类型)比当前时间早
@NotEmpty 验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)
@NotBlank 验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格
@Email 验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式

3 、代码实现(这个代码我是根据https://blog.csdn.net/u014029255/article/details/55518598 这个博客进行测试)
3.1添加JAR包依赖
在pom.xml中添加如下依赖:

<!--jsr 303--><dependency><groupId>javax.validation</groupId><artifactId>validation-api</artifactId><version>1.1.0.Final</version></dependency><!-- hibernate validator--><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>5.2.0.Final</version></dependency>

3.2最简单的参数校验
3.2.1、Model 中添加校验注解

public class Book {
//id是自动增加我就没有做操作private long id;@NotEmpty(message = "书名不能为空")private String bookName;@NotNull(message = "ISBN号不能为空")private String bookIsbn;@DecimalMin(value = "0.1",message = "单价最低为0.1")
private doubleprice; // getter setter .......  }

3.2.2、在controller中使用此校验

@RequestMapping(value = "/book",method = RequestMethod.POST)public void addBook(@RequestBody @Valid Book book) {System.out.println(book.toString());}

当访问这个post接口时,如果参数不符合Model中定义的话,程序中就回抛出400异常,并提示错误信息。

3.3分组验证
对同一个Model,我们在增加和修改时对参数的校验也是不一样的,这个时候我们就需要定义分组验证,步骤如下

3.3.1、定义两个空接口,分别代表Person对象的增加校验规则和修改校验规则

/*** 可以在一个Model上面添加多套参数验证规则,此接口定义添加Person模型新增时的参数校验规则*/public interface PersonAddView {}/*** 可以在一个Model上面添加多套参数验证规则,此接口定义添加Person模型修改时的参数校验规则*/
public interface PersonModifyView {}

3.3.2、Model上添加注解时使用指明所述的分组

public class Person {private long id;/*** 添加groups 属性,说明只在特定的验证规则里面起作用,不加则表示在使用Deafault规则时起作用*/@NotNull(groups = {PersonAddView.class, PersonModifyView.class}, message= "添加、修改用户时名字不能为空",payload = ValidateErrorLevel.Info.class)@ListNotHasNull.List({@ListNotHasNull(groups = {PersonAddView.class}, message = "添加上Name不能为空"),@ListNotHasNull(groups = {PersonModifyView.class}, message = "修改时Name不能为空")})private String name;@NotNull(groups = {PersonAddView.class}, message = "添加用户时地址不能为空")private String address;@Min(value = 18, groups = {PersonAddView.class}, message = "姓名不能低于18岁")@Max(value = 30, groups = {PersonModifyView.class}, message = "姓名不能超过30岁")private int age;//getter setter 方法......}

3.3.3、启用校验
此时启用校验和之前的不同,需要指明启用哪一组规则

/*** 添加一个Person对象* 此处启用PersonAddView这个验证规则* 备注:此处@Validated(PersonAddView.class)表示使用PersonAndView这套校验规则,若使用@Valid 则表示使用默认校验规则,* 若两个规则同时加上去,则只有第一套起作用*/@RequestMapping(value = "/person", method =RequestMethod.POST)public void addPerson(@RequestBody @Validated({PersonAddView.class,Default.class}) Person person) {System.out.println(person.toString());}/*** 修改Person对象* 此处启用PersonModifyView这个验证规则*/@RequestMapping(value = "/person", method = RequestMethod.PUT)public void modifyPerson(@RequestBody @Validated(value ={PersonModifyView.class}) Person person) {System.out.println(person.toString());
}

3.4 Spring validator 方法级别的校验
JSR和Hibernate validator的校验只能对Object的属性进行校验,不能对单个的参数进行校验,spring 在此基础上进行了扩展,添加了MethodValidationPostProcessor拦截器,可以实现对方法参数的校验,实现如下:

3.4.1、实例化MethodValidationPostProcessor

@Beanpublic MethodValidationPostProcessormethodValidationPostProcessor() {return new MethodValidationPostProcessor();}

3.4.2、在所要实现方法参数校验的类上面添加@Validated,如下

@RestController
@Validated
public class ValidateController {
}

3.4.3、在方法上面添加校验规则:

@RequestMapping(value = "/test",method = RequestMethod.GET)public String paramCheck(@Length(min = 10) @RequestParam String name) {System.out.println(name);return null;}

3.5使用BindingResult对象来保存验证结果
每一个模型对象后边都需要跟一个Errors或BindingResult对象来保存验证结果,其方法体内部可以使用这两个验证结果对象来选择出错时跳转的页面或处理的逻辑。

@RequestMapping("/validate/multi")
public String multi(@Valid@ModelAttribute("a") A a, BindingResult aErrors, @Valid@ModelAttribute("b") B b, BindingResult bErrors) { if (aErrors.hasErrors()) { //如果a模型对象验证失败 return "validate/error"; } if (bErrors.hasErrors()) { //如果a模型对象验证失败 return "validate/error"; } return "redirect:/success";
}

JSR303参数校验相关推荐

  1. JSR303 参数校验

    什么是JSR303 参数校验? JSR303 是一套 JavaBean 参数校验的标准,它定义了很多常用的校验注解,我们可以直接将这些注解加在我们 JavaBean 的属性上面,就是类里面的字段上面, ...

  2. jsr-303 参数校验-学习(转)

    1.是什么? JSR303 是一套 JavaBean 参数校验的标准,它定义了很多常用的校验注解,比如: ----------------------------------------------- ...

  3. 【全网最全】JSR303参数校验与全局异常处理(从理论到实践别用if判断参数了)

    一.前言 我们在日常开发中,避不开的就是参数校验,有人说前端不是会在表单中进行校验的吗?在后端中,我们可以直接不管前端怎么样判断过滤,我们后端都需要进行再次判断, 为了安全 .因为前端很容易拜托,当测 ...

  4. JSR303参数校验(2)

    前言:之前咱们讲解了什么是JSR303,并且使用他的实现Hibernate Validator做了简单的参数校验,并且通过BindingResult获取到了出现异常的信息并返回给了前端,这样大大简化了 ...

  5. jsr-303 参数校验—自定义校验注解

    1.为什么要自定义? 通过上篇学习,了解到很多常用注解了,但是呢,总是有那么些需求.... 2.案例分析(手机号格式) 2.1.需要验证的实体 Bean public class LoginVo {@ ...

  6. JSR303参数校验知识

    1 依赖  <dependency><groupId>javax.validation</groupId><artifactId>validation- ...

  7. Spring Boot 2.x基础教程:JSR-303实现请求参数校验

    点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 作者 | 翟永超 来源 | didispace.com/spring-boot-learni ...

  8. 【工具】JSR-303后端参数校验框架的使用方法及说明

    [工具]JSR-303后端参数校验框架的使用方法及说明 文章目录 [工具]JSR-303后端参数校验框架的使用方法及说明 1. 统一校验需求 2. 使用说明 2.1 引入依赖 2.2 规则说明 2.3 ...

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

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

最新文章

  1. 卡尔曼滤波:究竟滤了谁?
  2. seo网站营销与内容营销不可分割
  3. java 执行外部命令 苹果_Java中执行外部命令
  4. 计算机没有游戏扫雷,系统没有扫雷游戏怎么办 简单几步轻松安装
  5. vivado在远程服务器上完成本地设备的程序烧写和调试(vivado远程调试)
  6. jsp 上传转码_最完整的处理jsp处理乱码问题步骤,不需要手工转码
  7. 贪心算法——找纸币问题
  8. rust怎么传送到队友_王者荣耀原初法阵怎么传送?原初法阵最多传送几个人?...
  9. 从set中取出指定位置的元素
  10. 记录一次奇葩的sleep(15)引起的Too many connections
  11. BFGS优化算法简介
  12. Python 中的 classmethod 和 staticmethod 有什么具体用途?
  13. 室内GPS定位初露峥嵘
  14. LTE资源调度(6)-功率余量报告PHR
  15. Scroller的使用及解析(滑动删除)
  16. ES6 对象的解构赋值
  17. C++ 一、C++简介
  18. FALL_20_NOTE EDAV「Exploratory Data Analysis and Visualization」图像可视化
  19. Verilog学习笔记(06)
  20. IntelliJ IDEA怎么创建package包下面的子包

热门文章

  1. 深度学习通用策略:SGD优化方法总结
  2. 实战演练(1-8节课)
  3. MybatisPlus分页查询
  4. python高职教师2019培训
  5. 介绍一个生成流程图工具—解放生产力
  6. 通过表单设计器动态生成数据库表以及动态查询的功能实现
  7. C++语言:C语言/C++语言的简介、发展历史、应用领域、编程语言环境IDE安装、最强学习路线之详细攻略
  8. Window创建虚拟WI-FI
  9. uni-app动态修改导航条的标题
  10. IDEA快速开发JAVA SWING教程