SpringBoot 校验post请求参数
导读
前后端分离项目中,前端往后端传值时,后端都要做参数格式校验,比如校验数字最大值、最小值、是否允许为空、日期格式等等。
添加依赖
<!-- 参数校验 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
自定义日期注解
作用
校验日期格式,自定义校验规格
DateTime.java
package net.ybclass.online_ybclass.utils; import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; @Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = DateTimeValidator.class)
public @interface DateTime {
String message() default "日期格式错误"; String format() default "yyyyMM"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {};
}
约束自定义注解校验器
作用
校验自定义注解验证格式
DateTimeValidator.java
package net.ybclass.online_ybclass.utils; import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.text.SimpleDateFormat; /**
* @ClassName:DateTimeValidator
* @Description:日期校验器
* @Author:chenyb
* @Date:2020/11/17 10:13 上午
* @Versiion:1.0
*/
public class DateTimeValidator implements ConstraintValidator<DateTime, String> {
private DateTime dateTime; /**
* 初始化
* @param dateTime
*/
@Override
public void initialize(DateTime dateTime) {
this.dateTime = dateTime;
} /**
* 验证参数
* @param value
* @param context
* @return
*/
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
// 如果 value 为空则不进行格式验证,为空验证可以使用 @NotBlank @NotNull @NotEmpty 等注解来进行控制,职责分离
if (value == null) {
return true;
}
String format = dateTime.format(); if (value.length() != format.length()) {
return false;
} SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format); try {
simpleDateFormat.parse(value);
} catch (Exception e) {
return false;
}
return true;
}
}
常用校验注解标签
- @AssertFalse 所注解的元素必须是Boolean类型,且值为false
- @AssertTrue 所注解的元素必须是Boolean类型,且值为true
- @DecimalMax 所注解的元素必须是数字,且值小于等于给定的值
- @DecimalMin 所注解的元素必须是数字,且值大于等于给定的值
- @Digits 所注解的元素必须是数字,且值必须是指定的位数
- @Future 所注解的元素必须是将来某个日期
- @Max 所注解的元素必须是数字,且值小于等于给定的值
- @Min 所注解的元素必须是数字,且值小于等于给定的值
- @Range 所注解的元素需在指定范围区间内
- @NotNull 所注解的元素值不能为null
- @NotBlank 所注解的元素值有内容
- @Null 所注解的元素值为null
- @Past 所注解的元素必须是某个过去的日期
- @PastOrPresent 所注解的元素必须是过去某个或现在日期
- @Pattern 所注解的元素必须满足给定的正则表达式
- @Size 所注解的元素必须是String、集合或数组,且长度大小需保证在给定范围之内
- @Email 所注解的元素需满足Email格式
demo
请求参数实体类
package net.ybclass.online_ybclass.model.request;
import net.ybclass.online_ybclass.utils.DateTime;
import javax.validation.constraints.*;
public class ParamValidRequest {
@Max(value = 100, message = "id=最大值不能超过100")
@Min(value = 1, message = "id=最小不能小于1")
private int id;
@NotNull(message = "userName======》@NotNull")
private String userName;
@NotBlank(message = "salary======》@NotBlank")
private String salary;
@NotBlank
@Pattern(regexp = "1234567890",message = "phone=手机号支持正则表达式,手机号必须:1234567890")
private String phone;
//删除时间,当输入的时间为2020-08-26或2020/08/26 11:22:33,时间格式不符合"yyyy-MM-dd HH:mm:ss"
//@Pattern(regexp = "^((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29))\\s+([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$")
@NotNull
@DateTime(format = "yyyy-MM-dd",message = "createDate=日期格式不正确,正确格式:yyyy-MM-dd")
private String createDate;
@AssertTrue(message = "flag=必须为true")
private Boolean flag;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getSalary() {
return salary;
}
public void setSalary(String salary) {
this.salary = salary;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getCreateDate() {
return createDate;
}
public void setCreateDate(String createDate) {
this.createDate = createDate;
}
public Boolean getFlag() {
return flag;
}
public void setFlag(Boolean flag) {
this.flag = flag;
}
@Override
public String toString() {
return "TestRequest{" +
"id=" + id +
", userName='" + userName + '\'' +
", salary='" + salary + '\'' +
", phone='" + phone + '\'' +
", createDate=" + createDate +
", flag=" + flag +
'}';
}
}
控制器
package net.ybclass.online_ybclass.controller; import net.ybclass.online_ybclass.model.request.ParamValidRequest;
import net.ybclass.online_ybclass.utils.JsonData;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController; @RestController
public class ParamController {
@PostMapping("param")
public JsonData param(@Validated @RequestBody ParamValidRequest request, BindingResult br) {
//判断参数是否校验失败,若校验失败,直接返回错误信息
if (br.hasErrors()) {
return JsonData.buildError(br.getFieldError().getDefaultMessage());
}
System.out.println(request);
return JsonData.buildSuccess("ok");
}
}
验证

补充
我之前一家公司的,用这种方法不行,然后自己手动写了个工具类,通过工具类校验请求参数格式,如下
package com.zcsoft.rc.bms.utils; import java.util.Set;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator; import com.sharingif.cube.core.exception.validation.ValidationCubeException;
import org.hibernate.validator.HibernateValidator;
/**
* @ClassName:ValidationUtils
* @Description:请求参数验证工具类
* @Author:chenyb
* @Date:2020/8/14 9:50 上午
* @Versiion:1.0
*/
public class ValidationUtils{
/**
* 使用hibernate的注解来进行验证
*
*/
private static Validator validator = Validation
.byProvider(HibernateValidator.class).configure().failFast(true).buildValidatorFactory().getValidator(); /**
* 功能描述: <br>
* 〈注解验证参数〉
*
* @param obj
* @see [相关类/方法](可选)
* @since [产品/模块版本](可选)
*/
public static <T> void validate(T obj) {
Set<ConstraintViolation<T>> constraintViolations = validator.validate(obj);
// 抛出检验异常
if (constraintViolations.size() > 0) {
throw new ValidationCubeException(String.format("参数校验失败:%s", constraintViolations.iterator().next().getMessage()));
}
}
}
控制层
@RequestMapping(value = "add", method= RequestMethod.POST)
public SecurityRiskLibaryAddRsp add(SecurityRiskLibaryAddReq req){
ValidationUtils.validate(req);
return securityRiskLibaryService.add(req);
}
SpringBoot 校验post请求参数的更多相关文章
- SpringBoot获取http请求参数的方法
SpringBoot获取http请求参数的方法 原文:https://www.cnblogs.com/zhanglijun/p/9403483.html 有七种Java后台获取前端传来参数的方法,稍微 ...
- springBoot 过滤器去除请求参数前后空格(附源码)
背景 : 用户在前端页面中不小心输入的前后空格,为了防止因为前后空格原因引起业务异常,所以我们需要去除参数的前后空格! 如果我们手动去除参数前后空格,我们可以这样做 @GetMapping(value ...
- springboot获取URL请求参数的多种方式
1.直接把表单的参数写在Controller相应的方法的形参中,适用于get方式提交,不适用于post方式提交. /** * 1.直接把表单的参数写在Controller相应的方法的形参中 * @pa ...
- springboot获取URL请求参数的几种方法
原文地址:http://www.cnblogs.com/xiaoxi/p/5695783.html 1.直接把表单的参数写在Controller相应的方法的形参中,适用于get方式提交,不适用于pos ...
- springboot使用之请求参数与基本注解
@PathVariable 作用:@PathVariable是spring3.0的一个新功能:接收请求路径中占位符的值,将URL中占位符参数{xxx}绑定到处理器类的方法形参中@PathVariabl ...
- Springboot采用hibernate-validate验证请求参数
在springboot项目使用hibernate-validate对请求参数添加注解进行校验 常用注解 @Null,标注的属性值必须为空 @NotNull,标注的属性值不能为空 @AssertTrue ...
- SpringBoot 拦截器获取http请求参数
SpringBoot 拦截器获取http请求参数-- 所有骚操作基础 目录 SpringBoot 拦截器获取http请求参数-- 所有骚操作基础 获取http请求参数是一种刚需 定义拦截器获取请求 为 ...
- Struts2请求参数校验
校验的分类 客户端数据校验 和 服务器端数据校验 客户端数据校验 ,通过JavaScript 完成校验 (改善用户体验,使用户减少出错 ) 服务器数据校验 ,通过Java代码 完成校验 struts2 ...
- Struts2请求参数合法性校验机制
在Action中通过代码执行数据校验 请求参数的输入校验途径一般分两种:客户端校验 :通过JavaScript 完成 (jquery validation插件),目的:过滤正常用户的误操作. 服务器校 ...
- 前端请求参数MD5加密校验,参数串解密
首先引入MD5加密库:=>https://cdn.bootcss.com/blueimp-md5/2.10.0/js/md5.min.js; 步骤:=>1.请求前对参数进行字典升序排序,排 ...
随机推荐
- leaflet常用插件汇总介绍
1.Leaflet Ant Path(线条流动效果) 在交通项目.管网应用的项目中,常常需要标注出道路的走向.河流的流向或者管线的流向等等,Leaflet Ant Path能够很好的解决这类问题: g ...
- Linux(四):Linux的打包和压缩详解
关于Linux的文件操作,这里汇总一下打包和压缩的一些命令,以及命令使用的详情. 打包(归档)和压缩 归档,也称为打包,指的是一个文件或目录的集合,而这个集合被存储在一个文件中.归档文件没有经过压缩, ...
- Splashtop 扩展了所有 Android 8.0 以上设备的远程控制功能
好消息:Splashtop远程访问和远程支持软件现在支持100多个品牌的 Android 设备. 2020年9月15日,远程访问和远程支持解决方案的全球领导者 Splashtop Inc. 宣布:所有 ...
- 厉害了!12秒将百万数据通过EasyExcel导入MySQL数据库中
一.写在开头 我们在上一篇文章中提到了通过EasyExcel处理Mysql百万数据的导入功能(一键看原文),当时我们经过测试数据的反复测验,100万条放在excel中的数据,4个字段的情况下,导入数据 ...
- 网络安全—Kerberos认证系统
文章目录 前提知识 原理 第一次对话 第二次对话 第三次对话 总结发现 前提知识 KDC:由AS.TGS,还有一个Kerberos Database组成. Kerberos Database用来存储用 ...
- C 编程异常 — /usr/bin/ld: 找不到 -lm
问题:在编程程序的时候报错. /usr/bin/ld: 找不到 -lm /usr/bin/ld: 找不到 -lc 原因:缺少库文件. 解决: yum install -y libstdc++-stat ...
- Dapr 与 .NET Aspire 结合使用获得无与伦比的本地开发体验
Dapr 提供了一组构建块,用于抽象分布式系统中常用的概念.这包括服务.缓存.工作流.复原能力.机密管理等之间的安全同步和异步通信.不必自己实现这些功能,可以消除样板,降低复杂性,并允许您专注于开发业 ...
- 【C#】爬取百度贴吧帖子 通过贴吧名和搜索关键词
背景:最近喜欢看百度贴吧,因为其内容大多都是吧友的真实想法表达等等原因.但是通过网页去浏览贴吧,始终觉得不够简介,浏览帖子的效率不高,自己就萌发了通过自己爬取贴吧感兴趣的关键字内容,自己写了个winf ...
- 【c#】 重复鼠标键盘动作
这个先录制好要重复的鼠标和键盘的操作,然后就能重复的执行保存的这些动作,这个是我从csdn下载的,原本不支持录制键盘动作. + 符号 开始/暂停录制 / 播放/暂停动作 - 退出程序 主要是用到了 ...
- centos7下启动Django项目报错(sqlite错误)
报错内容如下: [root@localhost project]# python3 manage.py runserver Watching for file changes with StatRel ...