【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 {@Overridepublic boolean supports(Class<?> clazz) {return MyObject.class.equals(clazz);}@Overridepublic void validate(Object target, Errors errors) {ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "name.empty", "姓名不能为空");// 其他验证规则}
}

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

  1. 在控制器中使用 @Validator 注解:
@Controller
public class MyController {@Autowiredprivate MyValidator validator;@InitBinderprotected 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> {@Overridepublic void initialize(MyCustomValidation constraintAnnotation) {// 初始化验证器}@Overridepublic boolean isValid(String value, ConstraintValidatorContext context) {// 自定义验证逻辑,返回 true 表示验证通过,返回 false 表示验证失败return value != null && value.startsWith("ABC");}
}

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

  1. 在实体类中使用自定义验证注解:
@Data
public class MyEntity {@MyCustomValidationprivate 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 初阶

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数字化技术无限延伸,VR全景点亮智慧生活

随着互联网的发展&#xff0c;我们无时无刻不再享受着互联网给我们带来的便利&#xff0c;数字化生活正在无限延伸&#xff0c;各行各业也开始积极布局智能生活。要说智慧生活哪个方面应用的比较多&#xff0c;那应该就是VR全景了&#xff0c;目前VR全景已经被各个行业广泛应用…

android studio安装教程

1、android studio 下载 下载网址&#xff1a;Download Android Studio & App Tools - Android Developers 2、开始安装 因为不需要每次连接手机进行调试&#xff0c;android studio给我们提供了模拟器调试环境。 一般选择自定义安装&#xff0c;这样可选sdk以及下载路径…

Idea Maven 构建,运行Java程序,二次开发Jmeter

Idea Maven 构建 1. maven下载2. Idea 配置3. 配置Maven镜像4. 在Maven项目pom.xml中添加依赖5. 创建jar包&#xff0c;更新pom&#xff0c;执行代码 1. maven下载 【官网】https://maven.apache.org/download.cgi 【其他版本】https://dlcdn.apache.org/maven/maven-3/ 2. …

【案例】登录注册

<template><div class"loginhome"><Header :butShow"butShow"></Header><div class"formdiv"><div style"text-align:center;padding:10px;"><h3>你好登录账号{{ stauts 3? 注册:登录 }}…

servlet介绍,tomcat容器下载启动

1.1servlet是什么&#xff1f; servlet是一种java程序类&#xff0c;这些类继承了httpservlet类。这些类没有main方法&#xff0c;有两大对象request请求&#xff0c; response响应对象。这些类需要servlet容器才可以运行。 servlet 2.5 servlet 3.0 WEB-INF/web.xml <…

UE4与pycharm联合仿真的调试问题及一些仿真经验

文章目录 ue4与pycharm联合仿真的调试问题前言ue4端的debug过程pycharm端 一些仿真经验小结 ue4与pycharm联合仿真的调试问题 前言 因为在实验中我需要用到py代码输出控制信息给到ue4中&#xff0c;并且希望看到py端和ue端分别在运行过程中的输出以及debug调试。所以&#xf…

IntelliJ IDEA maven配置,设置pom.xml的配置文件

IntelliJ IDEA项目&#xff0c;选择 文件 设置&#xff0c;弹窗 构建、执行、部署 构建工具 Maven就可以 maven配置好以后&#xff0c;在pom.xml的配置文件中就可以设置对应的jar包了&#xff0c;这样构建的时候自动需要的jar&#xff0c;在项目中导入即 需要的jar包设置在po…

AVL——平衡搜索树

✅<1>主页&#xff1a;我的代码爱吃辣&#x1f4c3;<2>知识讲解&#xff1a;数据结构——AVL树☂️<3>开发环境&#xff1a;Visual Studio 2022&#x1f4ac;<4>前言&#xff1a;AVL树是对二叉搜索树的严格高度控制&#xff0c;所以AVL树的搜索效率很高…

图床项目进度(一)——UI首页

1. 前言 前面我不是说了要做一个图床吗&#xff0c;现在在做ui。 我vue水平不够高&#xff0c;大部分参考b站项目照猫画虎。 vue实战后台 我使用ts&#xff0c;vite&#xff0c;vue3进行了重构。 当然&#xff0c;我对这些理解并不深刻&#xff0c;许多代码都是游离于表面&am…

小白到运维工程师自学之路 第七十九集 (基于Jenkins自动打包并部署Tomcat环境)2

紧接上文 4、新建Maven项目 clean package -Dmaven.test.skiptrue 用于构建项目并跳过执行测试 拉到最后选择构建后操作 SSH server webExec command scp 192.168.77.18:/root/.jenkins/workspace/probe/psi-probe-web/target/probe.war /usr/local/tomcat/webapps/ /usr/loca…

mysql基本操作

常用的数据类型 int 整型用于定义整数类型的数据float 单精度浮点4字节32位 准确表示到小数点后六位 double 双精度浮点8字节64位双精度浮点8字节64位char 固定长度的字符类型用于定义字符类型数据varchar可变长度的字符类型 text文本image图片de…

Java IO流(五)Netty实战[TCP|Http|心跳检测|Websocket]

Netty入门代码示例(基于TCP服务) Server端 package com.bierce.io.netty.simple; import io.netty.bootstrap.ServerBootstrap; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.*; import io.netty.channel.nio.NioEventLoopGro…

使用动态IP是否会影响网络

今天我们要谈论的话题是关于动态IP和网络的关系。也许有些小伙伴对这个概念还比较陌生&#xff0c;但别担心&#xff0c;我会简单明了的给你理清楚。让我们一起看看动态IP到底能否影响到网络。 首先&#xff0c;我们先来搞明白什么是动态IP。在互联网世界中&#xff0c;每一个连…

跨越边界:从前端切图仔走进iOS开发(Swift版--上集)

本文简介 点赞 关注 收藏 学会了 本文将以前端开发者的视角&#xff0c;和各位工友进入iOS开发的世界。 本文以实战为导向&#xff0c;快速掌握iOS开发这个技能。 无论你是想要扩展技能领域&#xff0c;还是对iOS开发充满好奇&#xff0c;花一个下午学习本文都能打开iOS开…

【consul】

consul 一、什么是服务注册与发现1.11.2 二、 什么是consul2.1定义2.2特性2.2.1服务注册与发现&#xff1a;2.2.2健康检查&#xff1a;2.2.3Key/Value存储&#xff1a; 三、consul部署-datacenter &#xff1a;指定数据中心名称&#xff0c;默认是dc1。consul &#xff1a;指定…

flask获取请求对象的get和post参数

前言 get请求参数是在URL里面的&#xff0c;post请求参数是放在请求头里面的 get请求&#xff1a; index_page.route("/get") def get():var_a request.args.get("a", "jarvis")return "request:%s,params:%s,var_a:%s" %(request…

接口自动化如何封装mysql操作

数据查询类封装 1. 功能分析 可以连接不同sql数据库查一条数据&#xff0c;多条数据可以获取不同格式的数据 2. 封装成数据库查询类 封装思路: 数据库查询模块有多个功能&#xff0c;且需要复用&#xff0c;所以封装成类创建对象方法实现各种查询在构造方法中创建连…

Word中对象方法(Methods)的理解及示例(上)

【分享成果&#xff0c;随喜正能量】奋斗没有终点,任何时候都是一个起点&#xff0c;沉潜是为了蓄势待发&#xff0c;沉潜是为了等待因缘。鲸豚沉潜于大海&#xff0c;幽兰深藏于山谷&#xff0c;能够经得起沉潜的人&#xff0c;才会有更高的成就。正如一年的树木只能当柴烧&am…

基于Jenkins自动打包并部署docker环境

目录 1、安装docker-ce 2、阿里云镜像加速器 3、构建tomcat 基础镜像 4、构建一个Maven项目 实验环境 操作系统 IP地址 主机名 角色 CentOS7.5 192.168.200.111 git git服务器 CentOS7.5 192.168.200.112 Jenkins git客户端 jenkins服务器 CentOS7.5 192.168…

TCP最大连接数问题总结

最大TCP连接数量限制有&#xff1a;可用端口号数量、文件描述符数量、线程、内存、CPU等。每个TCP连接都需要以下资源&#xff0c;如图所示&#xff1a; 1、可用端口号限制 Q&#xff1a;一台主机可以有多少端口号&#xff1f;端口号与TCP连接&#xff1f;是否能修改&#x…