使用springboot校验客户端传来的数据

无尽函数      2022-04-26     316

关键词:

前端的数据校验都是辣鸡!后端天下第一!

很多时候我们后端需要前端传数据过来, 比如注册, 修改用户名, 修改密码等等。很可能有些用户就喜欢搞事, 喜欢发一大堆乱七八糟的数据到后端来, 甚至有些前端老哥甚至都不做校验, 简直气死人。所以我们后端必须自己做校验。这节介绍一下如何优雅地做数据校验。

做数据校验还是有原则的, 只有一条:不要相信前端传过来的任何数据。

如果想完美地贯彻原则, 理论上来说就应该让前端那边少传数据过来, 有些的东西能查的就自己查出来。

常用的数据校验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

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








客户端传入数据的校验-restcontroller进阶(代码片段)

...行数据校验 BeanValidation注解(需要加入相关依赖,在SpringBoot中可以直接使用,SpringBoot会帮我们直接加入)@Null验证对象是否为空(属性必须为空,客户不能传入此属性,否则会报错)@NotNull验证对象是否为非空(属性不为空... 查看详情

springboot数据校验(代码片段)

文章目录2.数据校验1.HibernateValidator2.JavaBean参数校验3.URL参数校验4.JavaBean对象级联校验5.分组校验6.声明自定义校验注解2.数据校验对于应用系统而言,任何客户端传入的数据都不是绝对安全有效的,这就要求我们在服务端... 查看详情

springboot之服务端数据校验

对于任何一个应用而言,客户端做的数据有效性验证都不是安全有效的,而数据验证又是一个企业级项目架构上最为基础的功能模块,这时候就要求我们在服务端接收到数据的时候也对数据的有效性进行验证。为什么这么说呢?... 查看详情

springboot数据校验(代码片段)

文章目录2.数据校验1.HibernateValidator2.JavaBean参数校验3.URL参数校验4.JavaBean对象级联校验5.分组校验6.声明自定义校验注解2.数据校验对于应用系统而言,任何客户端传入的数据都不是绝对安全有效的,这就要求我们在服务端... 查看详情

springboot服务端表单数据校验(代码片段)

1、首先说明一下,这里使用的是Springboot2.2.6.RELEASE版本,由于Springboot迭代很快,所以要注意版本问题。  SpringBoot对表单做数据校验,SpringBoot对表单数据校验的技术特点,SpringBoot中使用了Hibernate-validate校验... 查看详情

springboot后端进行数据校验——jsr303的使用

原创不易,未经允许,请勿转载。博客主页:https://blog.csdn.net/qq_43058685?spm=1001.2014.3001.5343如果只想查看注解,请跳到文章末尾部分文章目录简介项目创建传统的检验方式使用JSR303自定义错误信息错误信息的获取与响应错误异常类... 查看详情

个人技术总结---基于springboot使用email进行验证码校验(代码片段)

一、技术概述? 做什么:基于SpringBoot使用Email进行验证码校验方法;原因:有关注册、忘记密码功能需要一定的验证来保证账号的安全性;难点:分为两部分,一部分就是如何发送email邮件,另一部分就是如何校验验证码,下面... 查看详情

【springboot】在springboot中使用hibernatevalidate

...,这个也是目前使用得比较多的验证器了。首先新建一个springboot项目,引入web依赖在web依赖中,已经引入了hibernate-validator的支持,所以只需要引入web依赖即可。如果你所使用的版本没有支持,或者不是使用SpringBoot项目,具体的... 查看详情

springboot2系列教程(十五)|服务端参数校验之一

估计很多朋友都认为参数校验是客户端的职责,不关服务端的事。其实这是错误的,学过Web安全的都知道,客户端的验证只是第一道关卡。它的参数验证并不是安全的,一旦被有心人抓到可乘之机,他就可以有各种方法来摸拟系... 查看详情

springboot参数校验(代码片段)

文章目录Springboot参数校验上一节Springbootcrud和swagger使用源码简介基本数据类型参数校验(包括string,以及基本数据类型的包装类)我们以String类型参数为例实体参数校验分组校验嵌套校验常用校验注解自定义校验下... 查看详情

springboot自定义校验注解

参考技术A系统执行业务逻辑之前,会对输入数据进行校验,检测数据是否有效合法的。所以我们可能会写大量的ifelse等判断逻辑,特别是在不同方法出现相同的数据时,校验的逻辑代码会反复出现,导致代码冗余,阅读性和可... 查看详情

后端使用@valid注解进行数据校验

...d注解对前端数据进行校验引入依赖首先呢,必须要有SpringBoot依赖,因为SpringBoot中整合了@Valid注解,如下图: 查看详情

vue-校验props传来的值(代码片段)

对父组件传来的值进行校验。Vue.component(‘child‘,props:content:type:String,required:false,default:‘lizhao‘,validator:function(value)returnvalue.length>5,template:"<div>content</div>")vara 查看详情

springboot参数校验以及分组校验的使用

SpringBoot参数校验以及分组校验的使用前言什么是validator注解介绍validator内置注解hibernatevalidator扩展注解注解使用单参数校验对象参数校验注解分组对象嵌套错误消息的捕获1、MissingServletRequestParameterException2、ConstraintViolationExceptio... 查看详情

springboot使用validator进行参数校验

Springboot使用validator进行参数校验添加数据效验单字段效验级联效验分组效验与组序列多字段关联效验执行数据效验@Valid注解处理validator异常controller接口处理ValidatorUtils工具类自定义异常及处理ValidatorUtils与接口添加数据效验&l... 查看详情

springboot参数校验以及分组校验的使用(代码片段)

SpringBoot参数校验以及分组校验的使用前言什么是validator注解介绍validator内置注解hibernatevalidator扩展注解注解使用单参数校验对象参数校验注解分组对象嵌套错误消息的捕获1、MissingServletRequestParameterException2、ConstraintViolationExceptio... 查看详情

springboot使用validator进行参数校验(代码片段)

Springboot使用validator进行参数校验添加数据效验单字段效验级联效验分组效验与组序列多字段关联效验执行数据效验@Valid注解处理validator异常controller接口处理ValidatorUtils工具类自定义异常及处理ValidatorUtils与接口添加数据效验&l... 查看详情

springboot项目整合websocket源码分析

背景在一个Springboot项目中,写了一个WebSocket服务端代码。具体代码网上一大堆,这里不再展示。同时,我在Websocket服务端的类里面,定义了一个Boolean类型的成员变量。当客户端websocket传来的参数是666时,将该... 查看详情