【Java 中级】一文精通 Spring MVC - 数据验证(七)

在这里插入图片描述

👉博主介绍: 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO 专家博主

⛪️ 个人社区:个人社区
💞 个人主页:个人主页
🙉 专栏地址: ✅ Java 高阶
🙉八股文专题:剑指大厂,手撕 Java 八股文

文章目录

      • 1. 什么是数据验证
      • 2. 数据验证的应用场景
      • 3. SpringMVC @Validator 使用方法
      • 4. SpringMVC 自定义数据验证案例

1. 什么是数据验证

SpringMVC 数据验证是指在 SpringMVC 框架中对用户提交的数据进行验证,确保数据的合法性和有效性。通过数据验证,可以防止无效或恶意的数据进入系统,提高系统的安全性和稳定性。以下是 SpringMVC 数据验证的相关内容:

  1. 注解驱动验证:SpringMVC 提供了一系列的注解,如 @NotNull、@NotEmpty、@Min、@Max 等,用于对请求参数进行验证。可以将这些注解应用到控制器方法的参数上,或者在实体类的属性上进行验证。

示例:

@RequestMapping("/example")
public String example(@NotNull @Min(18) Integer age, @NotEmpty String name) {
    // 验证年龄不为空且大于等于18,姓名不为空
    // 处理业务逻辑
    return "example";
}
  1. 自定义验证器:除了使用注解进行验证外,还可以创建自定义的验证器来实现更复杂的验证逻辑。自定义验证器需要实现 Spring 的 Validator 接口,并在控制器方法或配置文件中进行注册。

通过以上方式,SpringMVC 可以方便地进行数据验证,确保数据的合法性和有效性。这有助于提高系统的安全性和可靠性。

2. 数据验证的应用场景

数据验证的应用场景广泛,适用于各种需要确保数据合法性和有效性的场景。以下是一些常见的数据验证应用场景:

  1. 表单验证:在用户提交表单数据时,验证输入的数据是否符合要求。例如,验证必填字段是否为空、验证邮箱格式是否正确、验证密码是否符合规定的复杂度等。

  2. 数据库操作:在进行数据库操作之前,对数据进行验证,以确保数据的完整性和一致性。例如,验证外键关联是否存在、验证唯一约束是否满足等。

  3. API 接口验证:在接收到外部请求时,对请求参数进行验证,以确保请求的合法性和安全性。例如,验证请求参数的类型和范围、验证请求头信息是否正确等。

  4. 身份验证:在用户登录或访问敏感信息时,对用户身份进行验证,以确保用户的合法性和权限。例如,验证用户名和密码是否匹配、验证访问令牌是否有效等。

  5. 数据转换和格式化:在将数据从一种格式转换为另一种格式时,进行数据验证,以确保转换的准确性和有效性。例如,将字符串转换为日期对象时,验证字符串是否符合日期格式。

  6. 业务规则验证:根据业务需求,对数据进行特定的验证。例如,验证订单金额是否超过用户账户余额、验证商品库存是否足够等。

数据验证在应用开发中扮演着重要的角色,可以保证数据的质量和一致性,提高系统的稳定性和安全性。

3. SpringMVC @Validator 使用方法

SpringMVC 中的 @Validator 注解用于对数据进行验证,确保数据的合法性和有效性。以下是 @Validator 的使用案例:

  1. 创建验证器类:
@Component
public class MyValidator implements Validator {

    @Override
    public boolean supports(Class<?> clazz) {
        return MyObject.class.equals(clazz);
    }

    @Override
    public void validate(Object target, Errors errors) {
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "name.empty", "姓名不能为空");
        // 其他验证规则
    }
}

在上述示例中,我们创建了一个名为 MyValidator 的验证器类,实现了 Validator 接口,并重写了 supports() 和 validate() 方法。supports() 方法用于指定该验证器支持的验证对象类型,validate() 方法用于实现具体的验证逻辑。

  1. 在控制器中使用 @Validator 注解:
@Controller
public class MyController {

    @Autowired
    private MyValidator validator;

    @InitBinder
    protected void initBinder(WebDataBinder binder) {
        binder.addValidators(validator);
    }

    @RequestMapping("/example")
    public String example(@Validated MyObject myObject, BindingResult result) {
        if (result.hasErrors()) {
            // 处理验证错误
            return "error";
        }
        // 处理业务逻辑
        return "example";
    }
}

在上述示例中,我们在控制器类中使用了 @Validator 注解,并在 initBinder() 方法中将自定义的验证器 MyValidator 添加到 WebDataBinder 中。然后,在处理请求的方法中使用 @Validated 注解标记需要验证的对象,并使用 BindingResult 参数接收验证结果。

通过这样的配置和使用,SpringMVC 会自动调用验证器对请求参数进行验证,验证结果会存储在 BindingResult 对象中。我们可以根据验证结果进行相应的处理,例如返回错误页面或处理业务逻辑。

4. SpringMVC 自定义数据验证案例

SpringMVC 中的数据验证可以通过自定义验证注解和验证器来实现。以下是一个自定义数据验证的案例:

  1. 创建自定义验证注解:
@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = MyCustomValidator.class)
public @interface MyCustomValidation {
    String message() default "自定义验证失败";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

在上述示例中,我们创建了一个名为 MyCustomValidation 的自定义验证注解。通过 @Constraint 注解指定了该注解的验证器类为 MyCustomValidator,并定义了一些默认的属性。

  1. 创建自定义验证器:
public class MyCustomValidator implements ConstraintValidator<MyCustomValidation, String> {

    @Override
    public void initialize(MyCustomValidation constraintAnnotation) {
        // 初始化验证器
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        // 自定义验证逻辑,返回 true 表示验证通过,返回 false 表示验证失败
        return value != null && value.startsWith("ABC");
    }
}

在上述示例中,我们创建了一个名为 MyCustomValidator 的自定义验证器类,实现了 ConstraintValidator 接口,并指定了该验证器对应的注解类型为 MyCustomValidation。在 isValid() 方法中实现了自定义的验证逻辑,判断字符串是否以 “ABC” 开头。

  1. 在实体类中使用自定义验证注解:
@Data
public class MyEntity {
    
    @MyCustomValidation
    private String myField;
 
}

在上述示例中,我们在实体类 MyEntity 的字段 myField 上使用了自定义的验证注解 @MyCustomValidation。

  1. 在控制器中进行数据验证:
@Controller
public class MyController {

    @RequestMapping("/example")
    public String example(@Valid MyEntity myEntity, BindingResult result) {
        if (result.hasErrors()) {
            // 处理验证错误
            return "error";
        }
        // 处理业务逻辑
        return "example";
    }
}

在上述示例中,我们在处理请求的方法中使用了 @Valid 注解来触发数据验证,并使用 BindingResult 参数接收验证结果。如果验证结果中存在错误,我们可以根据需要进行相应的处理。

通过自定义验证注解和验证器,我们可以实现更加灵活和复杂的数据验证逻辑,以满足具体的业务需求。

精彩专栏推荐订阅:在下方专栏👇🏻
✅ 2023年华为OD机试真题(A卷&B卷)+ 面试指导
✅ 精选100套 Java 项目案例
✅ 面试需要避开的坑(活动)
✅ 你找不到的核心代码
✅ 带你手撕 Spring
✅ Java 初阶

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/93099.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uniapp 实现切换tab锚点定位到指定位置

1.主要使用uniapp scroll-view 组件的scroll-into-view属性实现功能 2.代码如下 <scroll-view:scroll-into-view"intoView"><u-tabsclass"tabs-list"change"tabChange":list"tabList"></u-tabs><view id"1&…

运算符(个人学习笔记黑马学习)

算数运算符 加减乘除 #include <iostream> using namespace std;int main() {int a1 10;int a2 20;cout << a1 a2 << endl;cout << a1 - a2 << endl;cout << a1 * a2 << endl;cout << a1 / a2 << endl;/*double a3 …

Java“牵手”天猫淘口令转换API接口数据,天猫API接口申请指南

天猫平台商品淘口令接口是开放平台提供的一种API接口&#xff0c;通过调用API接口&#xff0c;开发者可以获取天猫商品的标题、价格、库存、商品快递费用&#xff0c;宝贝ID&#xff0c;发货地&#xff0c;区域ID&#xff0c;快递费用&#xff0c;月销量、总销量、库存、详情描…

【OpenCV • c++】图像对比度调整 | 图像亮度调整

&#x1f680; 个人简介&#xff1a;CSDN「博客新星」TOP 10 &#xff0c; C/C 领域新星创作者&#x1f49f; 作 者&#xff1a;锡兰_CC ❣️&#x1f4dd; 专 栏&#xff1a;【OpenCV • c】计算机视觉&#x1f308; 若有帮助&#xff0c;还请关注➕点赞➕收藏&#xff…

MR混合现实石油化工课堂情景实训教学演示

MR&#xff08;混合现实&#xff09;技术是一种结合了虚拟现实&#xff08;VR&#xff09;和增强现实&#xff08;AR&#xff09;优势的新型技术&#xff0c;在教育领域具有广阔的应用前景。在石油化工课堂中&#xff0c;MR混合现实情景实训教学的应用可以大大提高学生的学习效…

AI时代,程序员需要焦虑吗?

原文来自 微信公众号"互联网技术人进阶之路". 目录 前言一、程序员会被 AI 取代么&#xff1f;二、服务端开发尚难被 AI 取代三、服务端开发何去何从&#xff1f;四、业界首部体系化、全景式解读服务端开发的著作第一部分&#xff1a;服务端开发的技术和方法第二部分…

OVRL-V2: A simple state-of-art baseline for IMAGENAV and OBJECTNAV 论文阅读

论文信息 题目&#xff1a;OVRL-V2: A simple state-of-art baseline for IMAGENAV and OBJECTNAV 作者:Karmesh Yadav&#xff0c; Arjun Majumdar&#xff0c; Ram Ramrakhya 来源&#xff1a;arxiv 时间&#xff1a;2023 代码地址&#xff1a; https://github.com/ykarmesh…

好用的可视化大屏适配方案

1、scale方案 优点&#xff1a;使用scale适配是最快且有效的&#xff08;等比缩放&#xff09; 缺点&#xff1a; 等比缩放时&#xff0c;项目的上下或者左右是肯定会有留白的 实现步骤 <div className"screen-wrapper"><div className"screen"…

细说GNSS模拟器的RTK功能(一)

什么是RTK&#xff1f; 实时动态载波相位差分技术&#xff08;RTK&#xff09;是通过测试来纠正当前卫星导航&#xff08;GNSS&#xff09;系统常见误差的应用。RTK定位基于至少两个GNSS接收机——参考站和一个或多个流动站。 参考站在可视卫星中获取测量数据&#xff0c;然后…

【FAQ】安防监控视频汇聚平台EasyCVR接入GB国标设备,无法显示通道信息的排查方法

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

一百六十四、Kettle——Linux上脚本运行kettle的转换任务(Linux本地、Linux资源库)

一、目的 在kettle的转换任务以及共享资源库、Carte服务创建好后&#xff0c;需要对kettle的转换任务用海豚调度器进行调度&#xff0c;调度的前提的写好脚本。所以&#xff0c;这篇博客首先介绍在Linux上脚本运行kettle的转换任务 二、前提准备 &#xff08;一&#xff09;…

Arduino程序设计(四)按键消抖+按键计数

按键消抖按键计数 前言一、按键消抖二、按键计数1、示例代码2、按键计数实验 参考资料 前言 本文主要介绍两种按键控制LED实验&#xff1a;第一种是采用软件消抖的方法检测按键按下的效果&#xff1b;第二种是根据按键按下次数&#xff0c;四个LED灯呈现不同的流水灯效果。 一…

python二维索引转一维索引 多维索引转一维索引

将二维索引转为1维索引 原博客地址&#xff1a;https://blog.csdn.net/qq_42424677/article/details/123011642 将n维索引映射成1维索引 def ravel_index(x, dims):i 0for dim, j in zip(dims, x):i * dimi jreturn i

Vue2(状态管理Vuex)

目录 一&#xff0c;状态管理Vuex二&#xff0c;state状态三&#xff0c;mutations四&#xff0c;actions五&#xff0c;modules最后 一&#xff0c;状态管理Vuex Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态&#xff0c;并…

opencv 水果识别+UI界面识别系统,可训练自定义的水果数据集

目录 一、实现和完整UI视频效果展示 主界面&#xff1a; 测试图片结果界面&#xff1a; 自定义图片结果界面&#xff1a; 二、原理介绍&#xff1a; 图像预处理 HOG特征提取算法 数据准备 SVM支持向量机算法 预测和评估 完整演示视频&#xff1a; 完整代码链接 一、…

基于SpringBoot的在线聊天系统

基于SpringBoot的在线聊天系统 一、系统介绍二、功能展示三.其他系统实现五.获取源码 一、系统介绍 源码编号&#xff1a;F-S03点击查看 项目类型&#xff1a;Java EE项目 项目名称&#xff1a;基于SpringBoot的在线聊天系统 项目架构&#xff1a;B/S架构 开发语言&#x…

线性代数的学习和整理13: 函数与向量/矩阵

目录 1 函数与 向量/矩阵 2 函数的定义域&#xff0c;值域&#xff0c;到达域 3 对应关系 1 函数与 向量/矩阵 下面两者形式类似&#xff0c;本质也类似 函数的&#xff1a; axy &#xff0c;常规函数里&#xff0c;a,x,y 一般都是单个数矩阵&#xff1a; AXY &a…

【CSS】CSS 背景设置 ( 背景半透明设置 )

一、背景半透明设置 1、语法说明 背景半透明设置 可以 使用 rgba 颜色值设置半透明背景 ; 下面的 CSS 样式中 , 就是 设置黑色背景 , 透明度为 20% ; background: rgba(0, 0, 0, 0.2);颜色的透明度 alpha 取值范围是 0 ~ 1 之间 , 在使用时 , 可以 省略 0.x 前面的 0 , 直接…

在线OJ平台项目

一、项目源码 Online_Judge yblhlk/Linux课程 - 码云 - 开源中国 (gitee.com) 二、所用技术与开发环境 1.所用技术: MVC架构模式 (模型&#xff0d;视图&#xff0d;控制器) 负载均衡系统设计 多进程、多线程编程 C面向对象编程 & C 11 & STL 标准库 C Boost 准标…

Docker打包JDK20镜像

文章目录 Docker 打包 JDK 20镜像步骤1.下载 jdk20 压缩包2.编写 dockerfile3.打包4.验证5.创建并启动容器6.检查 Docker 打包 JDK 20镜像 步骤 1.下载 jdk20 压缩包 https://www.oracle.com/java/technologies/downloads/ 2.编写 dockerfile #1.指定基础镜像&#xff0c;并…