使用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附加的注解

注解 作用
@Email 被注解的元素必须是电子邮箱地址
@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

需要注意的是, 如果你在父类中约束了某些属性, 那么这些约束在子类中同样有效。

原文地址:https://www.cnblogs.com/zilongmao/p/10290206.html

时间: 2024-08-10 19:39:26

使用SpringBoot校验客户端传来的数据的相关文章

JAVA后端生成Token(令牌),用于校验客户端,防止重复提交

转:https://blog.csdn.net/u011821334/article/details/79390980 转:https://blog.csdn.net/joshua1830/article/details/78931420 AVA后端生成Token(令牌),用于校验客户端,防止重复提交 1.概述:在web项目中,服务端和前端经常需要交互数据,有的时候由于网络相应慢,客户端在提交某些敏感数据(比如按照正常的业务逻辑,此份数据只能保存一份)时,如果前端多次点击提交按钮会导致提交多份数

Android客户端和服务器端数据交互

网上有很多例子来演示Android客户端和服务器端数据如何实现交互不过这些例子大多比较繁杂,对于初学者来说这是不利的,现在介绍一下代码最简单.逻辑最清晰的交互例子: 一.服务器端: 二.Android手机客户端:

TCP协议客户端键盘录入数据,服务器端写到文本文件

package cn.idcast9; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.Socket; // 客户端键盘录入数据,服务器端写到文本文件 public class ClientDemo

SpringMVC客户端发送json数据时报400错误

当测试客户端发送json数据给服务器时,找不到响应路径? 原来是参数类型不符,即使是json也要考虑参数的个数和类型 解决:将age请求参数由"udf"改为"3"或任意数字即可

JSP内置对象-request传来的数据中文乱码处理

JSP的内置对象request可以接收从客户端传来的参数信息,即用户提交的信息,但是当requesr获取客户端提交的汉字信息时,会出现乱码(仅限中文). 我们可以对该汉字字符进行重新编码,很简单,看代码: 我们先建一个客户端信息提交页面,提交中文: 现在我们新建一个服务器接收页面用来显示出客户端传来的参数信息: 可以看到我们用JSP内置对象request接收显示客户端传来的参数时出现了乱码 怎么处理,我们只需要把request传来的参数进行重新编码,就简单的一行代码: 现在再来看看结果: 现在就

android客户端和网站数据交互的实现(基于Http协议获取数据方法)

android客户端一般不直接访问网站数据库,而是像浏览器一样发送get或者post请求,然后网站返回客户端能理解的数据格式,客户端解析这些数据,显示在界面上,常用的数据格式是xml和json. 可以理解客户端其实是一个你自己定义标记语言的浏览器,一般浏览器能解析的是html+css的数据,而android客户端能解析的是xml和json(或者都不是而是你自己定义的火星格式),服务端为了能满足客户端输出这种数据格式的需求,不得不专门针对客户端开发不同于浏览器访问的接口. 开发一个网站的客户端你需

一种客户端同步server数据的方案

场景 客户端A不定时地把本地数据同步到server上,然后另一个客户端B(app)从server把数据同步下来,汇总展示 客户端A数据结构 原始的数据(来自客户端A),每条都有create_time和modify_time,用于表示这条记录的创建时间和修改时间.同时系统里还有latest_backup_time字段,用来表示上次备份的时间.客户端每次备份,都会以这3个字段作为条件,找出需要备份的数据,上传到server 服务端数据结构 由于历史遗留问题,服务端收到备份数据之后,没有做其他的处理,

用response向客户端输出中文数据(乱码问题分析)

Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象,和代表响应的response对象.request和response对象既然代表请求和响应,那我们要获取客户机提交过来的数据,只需要找request对象就行了.要向客户机输出数据,只需要找response对象就行了. response常见应用(一):向客户端输出中文数据 1 package com.yyz.response; 2 3 import java.io.IOException; 4 im

Android客户端和服务器端数据交互的第二种方法

网上有很多例子来演示Android客户端和服务器端数据如何实现交互不过这些例子大多比较繁杂,对于初学者来说这是不利的,现在介绍几种代码简单.逻辑清晰的交互例子,本篇博客介绍第二种: 一.服务器端: 代码1:添加名为"AndroidServerServlet.java"的文件 package com.ghj.packageofservlet; import java.io.IOException; import java.io.PrintWriter; import javax.serv