使用SpringBoot校验客户端传来的数据
前端的数据校验都是辣鸡!后端天下第一!
很多时候我们后端需要前端传数据过来, 比如注册, 修改用户名, 修改密码等等。很可能有些用户就喜欢搞事, 喜欢发一大堆乱七八糟的数据到后端来, 甚至有些前端老哥甚至都不做校验, 简直气死人。所以我们后端必须自己做校验。这节介绍一下如何优雅地做数据校验。
做数据校验还是有原则的, 只有一条:不要相信前端传过来的任何数据。
如果想完美地贯彻原则, 理论上来说就应该让前端那边少传数据过来, 有些的东西能查的就自己查出来。
常用的数据校验like this:
/**
* 判断对象是否不为空
* @param object
* @return
*/
public static boolean isEmpty (Object object) {
if ("".equals(object) || object == null) {
return false;
}
return true;
}
/**
* 判断字符串是否不为空
* @param str
* @return
*/
public static boolean isEmpty (String str) {
if ("".equals(str) || str == null) {
return false;
}
return true;
}
/**
* 判断Integer是否不为空
* @param i
* @return
*/
public static boolean isEmpty (Integer i) {
if ("".equals(i) || i == null) {
return false;
}
return true;
}
写个Util类, 然后每次校验数据都要调用它的方法, 像这样一次又一次去判断实在是太不优雅了, 甚至于有的接口就那么十来行代码, 校验语句就要用一半,这样写出来的代码是不会好看的。下面我们看一下JSR303。
JSR303是JAVA管理委员会定制的一种规范, 是对关于Bean Validation(对javabean进行验证)的一个接口, 它是没有具体实现的。但有一个现成的已经实现了JSR303的框架Hibernate Validator我们可以在SpringBoot中直接使用。
下表介绍Bean Validation中的注解及作用:
1.Bean Validation中内置的注解
| 注解 | 作用 |
|---|---|
| @Null | 被注解的元素必须为 null |
| @NotNull | 被注解的元素必须不为 null |
| @AssertTrue | 被注解的元素必须为 true |
| @AssertFalse | 被注解的元素必须为 false |
| @Min(value) | 被注解的元素必须是一个数字,其值必须大于等于指定的最小值 |
| @Max(value) | 被注解的元素必须是一个数字,其值必须小于等于指定的最大值 |
| @DecimalMin(value) | 被注解的元素必须是一个数字,其值必须大于等于指定的最小值 |
| @DecimalMax(value) | 被注解的元素必须是一个数字,其值必须小于等于指定的最大值 |
| @Size(max, min) | 被注解的元素的大小必须在指定的范围内 |
| @Digits (integer, fraction) | 被注解的元素必须是一个数字,其值必须在可接受的范围内 |
| @Past | 被注解的元素必须是一个过去的日期 |
| @Future | 被注解的元素必须是一个将来的日期 |
| @Pattern(value) | 被注解的元素必须符合指定的正则表达式 |
| @Valid | 级联验证(Bean中Bean是不能为空的) |
2.Hibernate Validator附加的注解
| 注解 | 作用 |
|---|---|
| 被注解的元素必须是电子邮箱地址 | |
| @Length | 被注解的字符串的大小必须在指定的范围内 |
| @NotEmpty | 被注解的字符串的必须非空 |
| @Range | 被注解的元素必须在合适的范围内 |
3.按照类型来分类
| 类型 | 注解 |
|---|---|
| 任何类型 | Null, NotNull |
| 布尔型 | AssertTrue, AssertFalse |
| 字符串 | NotBlank, Pattern, Size, Email, DecimalMax, DecimalMin, Digits |
| 数值 | DecimalMax, DecimalMin, Digits, Max, Min, Negative, NegativeOrZero, Positive, PositiveOrZero |
| 集合/Map/List | NotEmpty, Size |
| 日期 | Future, Past, FutureOrPresent, PastOrPresent |
下面搞几个例子
@NotNull // 虽然限制了students不能为空, 但它并不能限制students里的每一个元素, 如果集合中有几个为Null的对象, 也是可以通过验证的
private List<Student> students;
@NotNull
@Valid // 级联验证做到了限制students里的每一个元素, 但这样会使代码可读性降低
private List<Student> students;
@NotNull // 所以, 为了保证可读性, 一般用于下面这种写法
private List<@Valid Student> students;
@NotNull // 这行表示strings此集合不能为空
@Size(min = 1) // 这行表示strings此集合的大小至少要为1
private List<@Size(min = 10) @NotNull String> strings;
// 集合里的Size和NotNull注解, 表示约束了集合中的每个String不能为空, 且长度至少是10
需要注意的是, 如果你在父类中约束了某些属性, 那么这些约束在子类中同样有效。
使用SpringBoot校验客户端传来的数据的更多相关文章
- JAVA后端生成Token(令牌),用于校验客户端,防止重复提交
转:https://blog.csdn.net/u011821334/article/details/79390980 转:https://blog.csdn.net/joshua1830/artic ...
- Android客户端和服务器端数据交互
网上有很多例子来演示Android客户端和服务器端数据如何实现交互不过这些例子大多比较繁杂,对于初学者来说这是不利的,现在介绍几种代码简单.逻辑清晰的交互例子,本篇博客介绍第四种: 一.服务器端: 代 ...
- SpringMVC客户端发送json数据时报400错误
当测试客户端发送json数据给服务器时,找不到响应路径? 原来是参数类型不符,即使是json也要考虑参数的个数和类型 解决:将age请求参数由"udf"改为"3" ...
- 自定义Attribute 服务端校验 客户端校验
MVC 自定义Attribute 服务端校验 客户端校验/* GitHub stylesheet for MarkdownPad (http://markdownpad.com) *//* Autho ...
- response小结(一)——用response向客户端输出中文数据(乱码问题分析)
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象,和代表响应的response对象.request和response对象既然代表请求和响应,那我们要 ...
- SpringBoot定制错误的Json数据
(1)自定义异常处理&返回定制Json数据 @ControllerAdvice public class MyExceptionHandler { @ResponseBody @Excepti ...
- 小程序犯错(一):“ReferenceError: 模拟服务器传来的数据 is not defined”
学习数据绑定,在onLoad中模拟服务器传数据时,报错:模拟服务器传来的数据 is not defined 我这里粗心的忘记注释说明了,如下: 把该行无关的错误数据注释或删除即可.这里提醒同学们,出现 ...
- 基于NIO的同步非阻塞编程完整案例,客户端发送请求,服务端获取数据并返回给客户端数据,客户端获取返回数据
这块还是挺复杂的,挺难理解,但是多练几遍,多看看研究研究其实也就那样,就是一个Selector轮询的过程,这里想要双向通信,客户端和服务端都需要一个Selector,并一直轮询, 直接贴代码: Ser ...
- 2) broadcast,这是启动完毕之后,集群中的服务器开始接收客户端的连接一起工作的过程,如果客户端有修改数据的改动,那么一定会由leader广播给follower,所以称为”broadcast”.
2) broadcast,这是启动完毕之后,集群中的服务器开始接收客户端的连接一起工作的过程,如果客户端有修改数据的改动,那么一定会由leader广播给follower,所以称为”broadcast” ...
随机推荐
- R语言学习笔记:读取前n行数据
常规读取 一般我们读取文件时都会读取全部的文件然后再进行操作,因为R是基于内存进行计算的. data <- read.table("C:\\Users\\Hider\\Desktop\ ...
- 配置rsync同步文件到nas
windows下以前的做法是安装一个cygwin包,现在不需要了,直接安装一个linux子系统用linux命令就行了. start cmd /k "c:\cygwin64\bin\rsync ...
- jar包编译成 dex
1.将需要合并的jar放到同一个目录 2.编写一个google.xml文件写入如下内容 <!--?xml version="1.0" encoding="utf-8 ...
- 记一次自启动的docker容器将宿主机的开机用户登录界面覆盖事件
宿主机的系统为CentOS7_7.7.1908,默认为GUI启动,安装了宝塔面板,docker-ce为最新版. 在启动了一个centos7的容器(镜像为centos官方镜像)后,将该容器重启策略设置为 ...
- 修改虚拟机CentOS系统ip地址和主机名
按照教程安装了虚拟机但是未配置静态IP,所以导致IP地址经常变化,CRT,mysql等连接时经常出现问题. 所以修改虚拟机内CentOS系统的IP为静态IP. 一.查看当前网关 虚拟机-->[编 ...
- PTA ”写出这个数“
读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字. 输入格式: 每个测试输入包含 1 个测试用例,即给出自然数 n 的值.这里保证 n 小于 10的100次方. 输出格式: 在 ...
- [AWS - EC2] 如何向 Amazon Linux 2 实例传输文件,下载文件。How to send/ download files from Amazon Linux 2 Instance
1. 需要: 安装 WinSCP 2. 需要: PuTTY 生成的ppk格式密钥, 没有的话请移步此文章,完成1, 2, 3步即可. 3. 打开 WinSCP , 如果提示已经有PuTTY配置是否导入 ...
- CF #546 D.E
D coun[i]表示[i]这个数右边有多少个数j能和他组成题中所给的二元组(i,j) 如果一个数的coun[i]=n-i-ans 那么说明他可以与最后一个交换 同时不计算贡献 因为它是向右走的 对左 ...
- Java 工具类 IpUtil - 获取本机所有 IP 地址,LocalHost 对应地址 IP
Java 工具类 IpUtil - 获取本机所有 IP 地址,LocalHost 对应地址 IP IP 工具类 源代码: /** * <p> * * @author XiaoPengwei ...
- 浅入深出Vue:登录
上一篇我们实现了注册功能,现在我们来实现一下登录功能. 准备工作 新建登录组件 添加登录组件的路由对象 新建登录组件 Login.vue: <template> <div> & ...