使用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” ...
随机推荐
- O056、Extend Volume 操作
参考https://www.cnblogs.com/CloudMan6/p/5645305.html 今天学习如何扩大volume的容量,为了保护现有的数据,cinder不允许缩小volume. ...
- Java注解【二、Java中的常见注解】
JDK自带注解 @Override 重写 @Deprecated 已过期 @Suppvisewarnings 压制警告 Demo: public interface Person { public S ...
- python部署到服务器(1) 一一 搭建环境
本机环境说明 linux下的CentOS 7, 自带python2.7.5, 使用 python --version 命令查看,因系统需要python2.7.5,因此我们并不卸载,另外安装python ...
- 【转】awk学习笔记
Awk学习笔记 整理:Jims of 肥肥世家 <jims.yang@gmail.com> Copyright © 2004 本文遵从GPL协议,欢迎转载.修改.散布. 第一次发布时间:2 ...
- deep_learning_Function_numpy_random.normal()
numpy常用函数之random.normal函数 np.random.normal(loc=0.0, scale=1.0, size=None) 作用: 生成高斯分布的概率密度随机数 loc:f ...
- ScrollView 滚动视图
ScrollView 种类: 1.HorizontalScrollView:水平滚动视图 2.ScrollView:垂直滚动视图(常用类) public class MainActivity exte ...
- DA_06_iptables 与 firewalld 防火墙
8.1 防火墙管理工具 防火墙作为公网与内网之间的保护屏障,在保障数据的安全性方面起着至关重要的作用.主要功能都是依据策略对穿越防火墙自身的流量进行过滤.防火墙策略可以基于 流量的源目地址.端口号.协 ...
- 使用remix的solidity在线编译环境部署一个faucet合约
一.浏览器打开https://remix.ethereum.org 地址 点击"+"新建一个sol文件,命名为faucet.sol 然后在代码区输入solidity代码 选择相关插 ...
- 由函数$y=\sin x$的图像伸缩变换为函数$y=\sin(\omega x)$的图像(交互式)
可以拖动滑动条\(\omega\)显示动态效果
- 重温JSP学习笔记
<% double d1 = 3.5; double d2 = 4.4; pageContext.setAttribute("d1", d1); pageContext.se ...