Validation 参数校验

【spring】参数校验Validation 在实际开发中,我们无法保证客户端传来的请求都是合法的。比如一些要求必传的参数没有传递,传来的参数长度不符合要求等,这种时候如果放任不管,继续执行后续业务逻辑,很有可能就会出现意想不到的bug。有人可能会说,这不是前端的问题吗,让前端校验去。话是这么说,但我们也不能前端校验百分百不会出现问题。并且有些请求可能也不是正规通过客户端发来的,可能是黑客恶意攻击,又或是通过Postman等发来的,这些请求就不一定会“合法”了。因此,对客户端传来的每个请求都进行必要的参数校验是十分重要的。 阅读详情

这里是修真院后端小课堂,每篇分享文从

今天给大家分享一下,修真院官网JAVA任务二,深度思考中的知识点

【Validation 参数校验】

  1. 背景介绍:

    参数验证是一个常见的问题,无论是前端还是后台,都需对用户输入进行验证,以此来保证系统数据的正确性。

    对于web来说,有些人可能理所当然的想在前端验证就行了,但这样是非常错误的做法,前端代码对于用户来说是透明的,

    稍微有点技术的人就可以绕过这个验证,直接提交数据到后台。参数验证随处可见,也是必不可少的。

    前端做验证只是为了用户体验,后端才是最终的保障。

  2. 知识剖析:

    (1) 常见的参数检验方式:

    a、表现层验证:SpringMVC提供对JSR-303的表现层验证,或者直接将拿到的参数在controller层里面用if判断

    b、业务逻辑层验证:Spring3.1提供对业务逻辑层的方法验证

    c、DAO层验证:Hibernate提供DAO层的模型数据的验证

    d、数据库端的验证:通过数据库约束来进行

    原理都是基于javax validation,有特殊需求的话,可以自定义校验

    (2) JSR 303

    JSR 303(Java Specification Requests 规范提案)是JAVA EE 6中的一项子规范,

    一套JavaBean参数校验的标准,叫做Bean Validation。

    JSR 303用于对Java Bean中的字段的值进行验证,Spring MVC 3.x之后之中也大力支持 JSR303

    JSR303提供的校验注解---------可以注解在javabean的field和properties上,也可以注解在map、list上,注解很灵活

    @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(regex=,flag=) 被注释的元素必须符合指定的正则表达式

    (3) Hibernate Validator

    Hibernate Validator是JSR-303的一个参考实现,它除了支持所有标准的校验注解外,还支持如下扩展注解

    @Email 被注解的元素必须是电子邮箱地址

    @Length(min=,max=) 被注解的字符串的大小必须在指定的范围内

    @NotBlank 验证字符串非null,且长度必须大于0

    @NotEmpty 被注释的字符串的必须非空

    @Range(min=,max=) 被注解的元素必须在合适的范围内

    (4) Spring校验框架

    Spring的org.springframework.validation是校验框架所在的包。LocalValidatorFactoryBean既实现了

    Spring的Validator接口,又实现了JSR-303的Validator接口。只要在Spring容器中定义一个LocalValidatorFactoryBean

    即可将其注入需要数据校验的Bean中。

  3. 常见问题:

    (1) SpringValidation和javax validation的区别

    JSR303是一项标准,他们规定一些校验规范即校验注解,位于javax.validation.constraints包下,.只提供规范不提供实现

    Hibernate validation,他提供了相应的实现,并增加了一些其他校验注解

    spring validation其在springmvc模块中添加了自动校验,并将校验信息封装进了特定的类中

    (2) 参数校验的基本使用

    多个属性的校验

    在日志或者控制台输出校验的信息

    部分注解仅能用于部分数据类型

    如@notblank注解仅用于字符串,使用时需注意

    (3) 自定义消息错误消息

    Spring中定义了一个MessageSource接口,以用于支持信息的国际化和包含参数的信息的替换。

    ApplicationContext接口继承了MessageSource接口,

    所以所有的ApplicationContext实现类都实现了MessageSource接口。

    也就是我们我们可以通过ApplicationContext来调用MessageSource接口方法以实现信息的国际化和替换信息中包含的参 数。

<mvc:annotation-driven validator=“validator” />

  1. 编码实战:

  2. 拓展思考:

    (1)分组校验

    分组简单说: 解决实体中每个属性都是设置了参数检验,但是在某个方法内只想检验部分属性任务,也可以叫分类,

    采用接口的方式来标识,可以类比java集合中的序列化接口 (Serializable)

    比如说有 用户名,密码,手机号,邮箱,年龄,性别,我想要检验其中的任意2个属性(假设为手机号,年龄),

    当然可以直接加入对应的注解,如果换成手机号和密码,肯定又要写2个注解,

    当字段过多,并且使用场景频繁时,分组是个不错的选择

    假设有2个分组 interface Group1,interface Group2

    @NotNull(message = “姓名不能为空”,groups = {Group1.class})

    private String name;

    指定分组后,使用@Validated(Group1.class) Student student,只检验指定分组

    (2)自定义校验

      这个不建议进行,现有的检验类型基本够,如果有更多要求,建议使用逻辑判断,这样更清晰,记录日志方便,出现问题可以及时排查。
    
  3. 参考文献:

https://blog.youkuaiyun.com/xu1916659422/article/details/77430924

https://blog.youkuaiyun.com/u013815546/article/details/77248003

  1. 更多讨论:

Q1:表单提交时,不填该表的内容,正常submit,默认为空字符串 “”,怎么解决

A1:在前端验证是否为空,后端使用isEmpty方法或者@NotEmpty注解

Q2: 为什么会出现 HV000030: No validator could be found for type: java.lang.Integer.

A2: 可能在Integer属性上加了不属于整型的校验,比如@NotEmpty,@Length等

Q3:数值性参数: 当输入为空时,字符串"",解析失败之后不能再进行其他判断,会出现NPE

A3:可以考虑使用自定义异常,使用Spring Aop功能拦截异常,给出自定义的错误信息

  1. 鸣谢:

  2. 结束语:

今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~

Validation参数校验拦截返回——Controller参数校验拦截器 日常项目开发中,validation包为后端校验提供了极大的遍历,那么对于校验失败提醒,我们又应该怎么将错误信息封装成json给前端呢? 单刀直入,直接上代码,客官慢用~~~ —————————— 参数校验拦截器 package com.rq.aop.common.handler; import com.alibaba.fastjson.JSON; import com.rq.aop.commo... 阅读详情

相关推荐

Validation参数校验

这里是修真院后端小课堂,每篇分享文从 八个方面深度解析后端知识/技能,本篇分享的是: 【Validation参数校验】 【修真院Java小课堂】Validation参数校验 大家好,我是IT修真院北京分院第35期一枚正直纯洁善良的Java程序员,今天给大家分享一下,修真院官网Java(职业)任务二,深度思考中的知识点——Validation参数校验 背景介绍 数据的校验是交互式网站一个不可或缺...

learning__java的博客 1918

Validation参数校验注解

注解 描述 @AssertFalse 被注解的元素必须为false @AssertTrue 被注解的元素必须为True @DecimalMax(value) 被注解的元素必须为一个数字,其值必须小于等于指定的最小值 @DecimalMin(Value) 被注解的元素必须为一个数字,其值必须大于等于指定的最小值 @Digits(integer=, fraction=) 被注解的元素必须为一个数字,其值必须在可接受的范围内 @Future 被注解的元素必须是日期,必须是将来日...

骑个小蜗牛的博客 1万+

SpringBoot中集成参数校验Validation

为了提供可靠的API接口,对参数进行校验,保证数据入库的正确性,同事通过添加注释使用Validation规范避免写一大堆的if -else的校验语句。使代码更加简单清晰。

码农从0到1 1473

Validator常用注解

规则: @AssertFalse Boolean,boolean 验证注解的元素值是false @AssertTrue Boolean,boolean 验证注解的元素值是true @NotNull 任意类型 验证注解的元素值不是null @Null 任意类型 验证注解的元素值是null BigDecimal, BigInteger, byte,short, int, long,等任何Number...

过于丰富,无法简介 1480

【QGIS】利用“创建网格”功能实现区域等距分割与坐标转换实战

本文详细介绍了如何在QGIS中使用“创建网格”工具实现区域等距分割。通过实战演示,将北京市行政区划切割为150米正方形网格,并重点讲解了关键步骤:选择投影坐标系EPSG:3857以确保网格尺寸精确,以及将结果转换为常用的WGS84经纬度坐标。文章还涵盖了进阶技巧与常见问题解决方案,帮助用户高效完成空间网格化分析任务。

weixin_29232507的博客 94

eNSP无法启动AR报错码40,而且按照eNSP帮助手册排查都没用,我的处理方法【自己存档版】

eNSP无法启动AR报错码40,而且按照eNSP帮助手册排查都没用,我的处理方法【自己存档版】

mizhiakk的博客 8401

validation参数检验 - 如何使用

文章目录Maven 依赖Spring MVC Controller 的输入验证 Path Variables、 Request Parameters、Request Header验证 RequestBody非 Controller 组件的方法自定义 Validator自定义一个验证需要的注解自定义 Constraint 注解注意点自定义一个 Validator定义一个 POJO 进行验证以纯代码方式使用 Validator,不依赖 Spring 的 `@Validate` 注解纯代码方式Spring 的非注

赵丙双的博客 7390

PDPS16.0单机版与SPLMLicenseServer授权避坑指南:从安装到冲突解决

本文详细解析了PDPS16.0单机版的安装与授权流程,重点阐述了如何正确配置SPLMLicenseServer本地许可证服务器以实现软件激活。针对安装过程中常见的许可证冲突问题,提供了清晰的排查思路和解决方案,并介绍了通过设置环境变量等替代授权方法,帮助用户高效避坑,确保Tecnomatix Process Simulate顺利运行。

weixin_29231221的博客 559

数据校验 Validation

在开发中,我们经常遇到参数校验的需求,比如用户注册的时候,要校验用户名不能为空、用户名长度不超过20个字符、手机号是合法的手机号格式等等。如果使用普通方式,我们会把校验的代码和真正的业务处理逻辑耦合在一起,而且如果未来要新增一种校验逻辑也需要在修改多个地方。而spring validation允许通过注解的方式来定义对象校验规则,把校验和业务逻辑分离开,让代码编写更加方便。Spring Validation其实就是对Hibernate Validator进一步的封装,方便在Spring中使用。

weixin_53120322的博客 1518

ESP32-S3驱动OV3660摄像头原理图设计,已量产

本文重点拆四条主线:多来源输入电源如何收敛到 3V3,摄像头三路供电如何拆分,ESP32-S3 如何接住 DVP 数据流与外部存储,以及音频/补光/传感外围怎样挂到主控边上。至于最终图像帧率、算法策略和软件时序,当前原理图未体现。

不脱发的程序猿 979

Dify之八添加各种在线大模型

Dify之八添加各种在线大模型

yilvyangguang520的博客 938

Java代码简洁-validation参数校验

validation参数校验

weixin_43994244的博客 9118

Python爬虫实战:利用Scrapy+Playwright高效爬取TED演讲数据

在当今信息爆炸的时代,TED演讲作为全球知名的思想传播平台,汇聚了各领域顶尖人才的精彩分享。对于数据分析师、研究人员或内容创作者来说,获取TED演讲的完整数据集具有重要价值。本文将详细介绍如何使用Python中最先进的爬虫技术组合——Scrapy框架配合Playwright浏览器自动化工具,高效爬取TED演讲的完整数据。传统爬虫技术在处理现代动态网页时面临诸多挑战,而本文将展示如何利用最新工具解决这些问题。

2201_76125261的博客 205

SpringBoot的validation参数校验

在项目开发过程,后端经常会对前端传递的参数进行各种校验,只有在校验通过时,才会执行后续的业务代码,否则抛出异常信息给前端。当参数较多时,刚开始会使用大量的 if…else…来逐一对参数进行检验,或则使用策略模式来方法来减少 if…else…的检验代码。但是将这些代码写在控制层或则业务层都会让代码过于臃肿。而且如果后期参数校验变了,或则参数不需要校验时,还需要大量删除,或修改检验参数的逻辑代码,因此采用 validation来对参数进行校验简化代码。

m0_74823658的博客 1799

Bootstrap方法详解——技术与实例

一、Introduction 如果说到Bootstrap你会想到什么?是Twitter推出的那个用于前端开发的开源工具包吗?Unfortunately,本文要讨论的并非是Bootstrap工具包,而是统计学习中一种重采样(Resampling)技术。这种看似简单的方法,对后来的很多技术都产生了深远的影响。机器学习中的Bagging,AdaBoost等方法其实都蕴含了Bootstrap的思想...

白马负金羁 8万+

Python爬虫实战:社交媒体热点事件追踪与情感分析可视化

本文探讨了如何利用Python爬虫技术从微博和Twitter等社交媒体平台抓取数据,进行热点事件追踪和情感分析,并通过可视化方式展示舆论情感变化。文章详细介绍了最新的爬虫技术、数据处理方法和可视化实现,提供了完整的代码示例,帮助读者构建自己的社交媒体分析系统。关键词:Python爬虫、社交媒体分析、情感分析、数据可视化、热点追踪爬虫框架:Requests-HTML、aiohttp、Twint(Twitter专用)数据处理文本处理:Jieba(中文分词)、NLTK(英文处理)情感分析。

2201_76125261的博客 1104

Spring Boot 参数校验 Validation 终极指南

注解使用场景抛出异常@Valid校验对象参数(如 @RequestBody)@Validated校验简单类型参数(如 @RequestParam)@Validated校验对象参数(需配合 @Valid 使用)在大多数项目中,无论是 Bean Validation 定义的约束,还是 Hibernate Validator 附加的约束,都是无法满足我们复杂的业务场景。所以,我们需要自定义约束。1)编写自定义约束的注解;2)编写自定义的校验器 ConstraintValidator。

〆、挽风的博客 2183

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

SpringBoot中参数校验 Validation

数据校验很重要,在前端对数据进行校验的情况下,我们还是要对传入后端的数据再进行一遍校验,避免用户绕过浏览器直接通过一些 HTTP 工具直接向后端请求一些违法数据。 虽然我们通过 if/else 语句对请求的每一个参数一一校验。但是这样写起来太麻烦了,而且破坏了单一职责原则。所以今天我们来看一下 Spring Boot validation 。 首先我们先来看两个注解 @Validated: 可以用在类型、方法和方法参数上。但是不能用在成员属性(字段)上; 用在方法入参上无法单独提供嵌套验证功能;能配合嵌套

tianynnb的博客 1801

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Spring-Validation校验参数

Spring-Validation校验参数 全方面使用参数校验工具 //被注释的元素,值必须是一个字符串,不能为null,且调用trim()后,长度必须大于0 @NotBlank(message="") //被注释的元素,值不能为null,但可以为"空",用于基本数据类型的非空校验上,而且被其标注的字段可以使用@size、@Max、@Min等对字段数值进行大小的控制 @NotNull(message="") //被注释的的元素,值不能为null,且长度必须大于0,一般用在集合类上面 @...

牧风人的博客 2326

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

上一篇: 怎么用Python写一个图片迁移脚本?
下一篇: JMeter工具的使用----为什么要进行压力测试?
learning__java
博客等级 码龄8年 87粉丝 174原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值