参数校验:简单的就逐个手动写代码校验,推荐用Valid,使用hibernate-validator提供的,如果参数不能通过校验,报400错误,请求格式不正确:
步骤1:在参数对象的属性上添加校验注解如@NotBlank
步骤2:用@Valid注解controller方法的参数对象
常用校验注解(通过注解的message属性自定义校验错误的信息):
@NotNull值不能为空
@Null值必须为空
@Pattern(regx=)字符串必须匹配正则表达式
@Size(min=,max=)集合元素数量必须在min和max之间
@CreditCardNumber(ignoreNonDigitCharacters=)字符串必须是信用卡号(按美国的标准校验)
@Email字符串必须是email地址
@Length(min=,max=)字符串长度
@NotBlank字符串必须有字符
@NotEmpty字符串不为null,集合有元素
@Range(min=,max=)数字范围
@SafeHtml字符串必须是安全的html
@URL字符串是合法的URL
@AssertFalse值必须是false
@AssertTrue值必须是true
@DecimalMax(value=,inclusive=)值必须小于等于(inclusive=true)/小于(inclusive=false)value指定的值,可以注解在字符串类型属性上
@DecimalMin(value=,inclusive=)值必须大于等于(inclusive=true)/大于(inclusive=false)value指定的值,可以注解在字符串类型属性上
@Digits(integer=,fraction=)数字格式检查,integer指定整数部分最大长度,fraction指定小数部分最大长度
@Future值必须是未来的日期
@Past值必须是过去的日期
@Max(value=)值必须小于等于value指定的值,不能注解在字符串类型属性上
@Min(value=)值必须大于等于value指定的值,不能注解在字符串类型属性上
当参数校验未通过,controller不会进入,某些场景,如参数校验出错,需要记录业务日志,可在controller方法添加BindingResult参数,即可携带错误信息进入controller方法
BindingResult对象封装了参数校验的错误信息,其hasErrors方法表示有错误,使用getAllErrors然后stream流化遍历获取单条错误信息(错误信息可以定制):
例如:
import lombok.Data;
import javax.validation.constraints.NotBlank;
@Data
public class User {
@NotBlank(message = "用户名不能为空")
private String username;
}
@GetMapping("/user")
public User user(@Valid User user, BindingResult errors) {
if(errors.hasErrors()) {
errors.getAllErrors().stream().forEach(
// error -> System.out.println(error.getDefaultMessage())
error -> {
FieldError fieldError = (FieldError)error; //Error是Object类型,转换成FieldError可以获取校验错误的属性字段
System.out.println(fieldError.getField() + " : " + error.getDefaultMessage());
}
);
}
return user;
}
复杂的业务场景比如校验传入的username是否已经在数据库中存在,需要自定义校验逻辑,步骤(其实就是自定义校验注解及其校验逻辑):
1.写校验类
2.写校验注解
3.在属性上使用(使用同系统提供的注解如@NotNull)
校验类:
package com.example.security.valid;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
/**
* 自定义校验类,实现ConstraintValidator接口,两个泛型分别是自定义的校验注解MyConstraint和注解生效的属性类型
* Object可以放在任何类型的属性上,String只能校验String类型的属性,如此
* initialize方法是校验器初始化执行,isValid是校验逻辑,value是属性值,context校验上下文,里面包含校验注解里面的信息
* 返回true校验通过,false校验失败,是javax.validation包提供的
*
* 该类里面可以通过@Autowire注入spring管理的bean。Spring会将实现了ConstraintValidator接口的类搞成bean,所以这个类不需要加@Component。
*/
public class MyConstraintValidtor implements ConstraintValidator<MyConstraint, Object> {
@Override
public void initialize(MyConstraint constraintAnnotation) {
System.out.println("MyConstraintValidtor initialize");
}
@Override
public boolean isValid(Object t, ConstraintValidatorContext constraintValidatorContext) {
return t.equals("123456");
}
}
校验注解:
package com.example.security.valid;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
/**
* 参考系统提供的校验注解可知,message,groups,payload这3个属性必须提供
* @Constraint(validatedBy = MyConstraintValidtor.class)指定该注解的校验类
*/
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = MyConstraintValidtor.class)
public @interface MyConstraint {
String message() default "校验未通过";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
- Hibernate Validator参数校验
日常开发中经常会遇到需要参数校验的情况,比如某个字段不能为空.长度不能超过5等都属于参数校验的范围.对于简单的参数校验通过写几个if-else判断语句就搞定,但是对于复杂的多个参数校验的情况,就不是那 ...
- jsr-303 参数校验—自定义校验注解
1.为什么要自定义? 通过上篇学习,了解到很多常用注解了,但是呢,总是有那么些需求.... 2.案例分析(手机号格式) 2.1.需要验证的实体 Bean public class LoginVo ...
- 使用spring validation完成数据后端校验-自定义校验的注解-判断是否为空
引入依赖 我们使用maven构建springboot应用来进行demo演示. <dependencies> <dependency> <groupId>org.sp ...
- Hibernate validator使用和自定义validator及整合Spring MVC
http://blog.csdn.net/lwphk/article/details/43983669 Hibernate validator使用 导入validation-api-xxx.jar 以 ...
- hibernate validator【原】
hibernate validator 功能 在开发中经常做一些字段校验的功能,比如非空,长度限制,邮箱验证等等,为了省掉这种冗长繁琐的操作,hibernate validator提供了一套精简的注释 ...
- hibernate validator自定义校验注解以及基于服务(服务组)的校验
hibernate validator是Bean Validation 1.1 (JSR 349) Reference Implementation,其广泛的应用在mvc的参数校验中,尤其是使用服务端 ...
- Hibernate Validator校验参数全攻略
1. 前言 数据字段一般都要遵循业务要求和数据库设计,所以后端的参数校验是必须的,应用程序必须通过某种手段来确保输入进来的数据从语义上来讲是正确的. 2. 数据校验的痛点 为了保证数据语义的正确,我们 ...
- hibernate.validator.constraints.NotEmpty校验请求参数报错java.lang.NoClassDefFoundError: javax/el/PropertyNotFoundException
spring maven项目,使用hibernate validator 注解形式校验客户端的请求参数. hibernate-validator版本:5.0.2.Final validation-ap ...
- 用spring的@Validated注解和org.hibernate.validator.constraints.*的一些注解在后台完成数据校验
这个demo主要是让spring的@Validated注解和hibernate支持JSR数据校验的一些注解结合起来,完成数据校验.这个demo用的是springboot. 首先domain对象Foo的 ...
随机推荐
- jquery 使用a标签导航栏跳转页面,动态添加高亮
众所周知,使用a标签跳转之后,会刷新一次,继而这个添加的样式就会消失.那么怎么解决这一问题呢? <script> $(function () { $('.bar a').each(func ...
- log4j日志输出格式
%n- 换行 %m - 日志内容 %p - 日志级别(FATAL, ERROR, WARN, INFO, DEBUG or custom) %r - 程序启动到现在的毫秒数 %% - percent ...
- 线程屏障CyclicBarrier实现原理
生产环境中,存在需要等待多个线程都达到某种状态后,才继续运行的情景.并发工具CyclicBarrier就能够完成这种功能.本篇从源码方面,简要分析CyclicBarrier的实现原理. 使用示例 pu ...
- bootstrap-table使用stickyHeader固定表头时,表头不跟随表体水平滚动问题解决
解决方法: onAll: function () { // 修复stickyHeader表头不跟随表体水平滚动的问题 if (params.stickyHeader) { var fixedTable ...
- Nginx-常用命令和配置文件
Nginx常用命令 1.启动命令 在/usr/local/nginx/sbin 目录下执行 ./nginx 2.关闭命令 在/usr/local/nginx/sbin 目录下执行 ./nginx s ...
- D0g3_Trash_Pwn_Writeup
Trash Pwn 下载文件 1 首先使用checksec查看有什么保护 可以发现,有canary保护(Stack),堆栈不可执行(NX),地址随机化没有开启(PIE) 2 使用IDA打开看看 mai ...
- 【leetcode】861. Score After Flipping Matrix
题目如下: 解题思路:本题需要知道一个数字规律,即pow(2,n) > sum(pow(2,0)+pow(2,1)+...+pow(2,n-1)).所以,为了获得最大值,要保证所有行的最高位是1 ...
- 一些vue 响应式系统的底层的细节
当你把一个普通的 JavaScript 对象传给 Vue 实例的 data 选项,Vue 将遍历此对象所有的属性,并使用 Object.defineProperty 把这些属性全部转为 getter/ ...
- KMP字符串匹配模板
题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next. (如果你不知道这是什么意思也不要问,去百度 ...
- Python_014(面向对象之继承)
一.面向对象之继承 1.初始继承 引入:面向对象的三大特性:继承,多态,封装 a.继承是创建新类的一种方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类;新建的类称为派生类 ...