简介:

  数据验证是作为一个企业级项目架构上设计的最基础的模块,前辈们曾说过:界面上传递到后台的数据没有百分之百值得相信的!为什么这么说呢?往往我们在编写程序的时候都会感觉后台的验证无关紧要,这样就会给别人空子钻。我可以模拟前台发送的请求到后台地址,那么我如果发送一些涉及系统安全的代码到后台,后果一发不可收拾。接下来我们就来讲解下SpringBoot项目内如何对参数进行校验!

本章目标

在SpringBoot项目内完成参数后台数据校验。

SpringBoot的Web组件内部集成了hibernate-validator,所以我们这里并不需要额外的为验证再导入其他的包,接下来我们先来看看SpringBoot为我们提供了哪些验证。

一、项目构建

  使用IntelliJ IDEA工具来构建一个SpringBoot项目,预先导入Web依赖

二、使用验证,书写实体类

  我们接下来创建一个实体叫做DemoEntity,实体内添加几个测试字段并对每个字段都做出验证处理

public class DemoEntity implements Serializable
{
@NotBlank
@Length(min = 2,max = 10)
private String name; @Min(value = 1)
private int age; @NotBlank
@Email
private String mail; //自定义验证,值为1或2或3,其他均不可通过验证
@FlagValidator(values = "1,2,3")
private String flag; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public String getMail() {
return mail;
} public void setMail(String mail) {
this.mail = mail;
} public String getFlag() {
return flag;
} public void setFlag(String flag) {
this.flag = flag;
}
}

三、创建一个名叫IndexController的控制器并通过页面传递参数的形式来校验数据

  我在控制器中注入了一个MessageSource的接口对象,这个对象是用于格式化错误消息的。根据传入的错误字段对象(FieldError)结合hibernate-validator验证的内置错误消息文件进行输出错误消息,hibernate-validator的错误消息支持国际化,所以我们获取错误消息的时候需要传入Locale对象获取本地的国际化类型。hibernate-validator错误消息文件在对应源码包内可以找到
@RestController
public class IndexController
{ @Autowired
private MessageSource messageSource; @RequestMapping(value = "/validator",method = RequestMethod.GET)
public String validator(@Valid DemoEntity entity, BindingResult result) {
if(result.hasErrors()) {
StringBuffer msg = new StringBuffer();
//获取错误字段集合
List<FieldError> fieldErrors = result.getFieldErrors();
//获取本地locale,zh_CN
Locale currentLocale = LocaleContextHolder.getLocale();
//遍历错误字段获取错误消息
for (FieldError fieldError :
fieldErrors) {
//获取错误信息
String errorMessage = messageSource.getMessage(fieldError,currentLocale);
//添加到错误消息集合内
msg.append(fieldError.getField()+":"+errorMessage+" , ");
}
return msg.toString();
}
return "验证通过," + "\t名称:" + entity.getName()+ "\t年龄:" + entity.getAge() + "\t邮箱地址:"+entity.getMail();
}
}

四、运行测试

五、自定义验证

1、自定义验证注解

我们先来创建一个注解,注解内部需要对应验证注解的验证实现类

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER, ElementType.FIELD})
@Constraint(validatedBy = FlagValidatorClass.class)
public @interface FlagValidator
{
//flag的有效值多个使用','隔开
String values();
//提示内容
String message() default "flag不存在"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {};
}

2、@Constraint注解,里面传入了一个validatedBy的字段,这个就是我们自定义注解的实现类的类型,实现类代码

  自定义验证实现类里面有两个方法,分别是初始化验证消息、执行验证。

  初始化验证消息方法内你可以得到配置的注解内容,而验证方法则是你的验证业务逻辑。

public class FlagValidatorClass implements ConstraintValidator<FlagValidator, Object> {

    //临时变量保存flag值列表
private String values; //初始化values的值
@Override
public void initialize(FlagValidator flagValidator) {
//将注解内配置的值赋值给临时变量
this.values = flagValidator.values();
} //实现验证
@Override
public boolean isValid(Object value, ConstraintValidatorContext constraintValidatorContext)
{
//分割定义的有效值
String[] value_array = values.split(",");
boolean isFlag = false;
//遍历比对有效值
for (int i =0;i<value_array.length;i++)
{
//存在一致跳出循环,赋值isFlag=true
if(value_array[i].equals(value))
{
isFlag = true;
break;
}
}
//返回是否存在boolean
return isFlag;
}
}

测试:

springboot(11)使用SpringBoot validator进行数据验证的更多相关文章

  1. 使用SpringBoot进行优雅的数据验证

    JSR-303 规范 在程序进行数据处理之前,对数据进行准确性校验是我们必须要考虑的事情.尽早发现数据错误,不仅可以防止错误向核心业务逻辑蔓延,而且这种错误非常明显,容易发现解决. JSR303 规范 ...

  2. SpringBoot系列五:SpringBoot错误处理(数据验证、处理错误页、全局异常)

    声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅. 1.概念: SpringBoot 错误处理 2.具体内容 在之前的程序里面如果一旦出现了错误之后就会出现一堆的大白板,这个白板会 ...

  3. java框架之SpringBoot(11)-缓存抽象及整合Redis

    Spring缓存抽象 介绍 Spring 从 3.1 版本开始定义了 org.springframework.cache.Cache 和 org.springframework.cache.Cache ...

  4. 数据验证validator 与 DWZ

    在进行系统经常使用的数据验证.数据验证可以编写自己的,它也可以用来作为现在.现在,记录这两个库的使用, validator <!DOCTYPE HTML PUBLIC "-//W3C/ ...

  5. springboot + 拦截器 + 注解 实现自定义权限验证

    springboot + 拦截器 + 注解 实现自定义权限验证最近用到一种前端模板技术:jtwig,在权限控制上没有用springSecurity.因此用拦截器和注解结合实现了权限控制. 1.1 定义 ...

  6. SpringBoot 03_利用FastJson返回Json数据

    自上一节:SpringBoot 02_返回json数据,可以返回json数据之后,由于有些人习惯于不同的Json框架,比如fastjson,这里介绍一下如何在SpringBoot中集成fastjson ...

  7. Springboot下实现阿里云短信验证功能(含代码)

    Springboot下实现阿里云短信验证功能 一 开通阿里云短信服务 阿里云官网注册登录 找到短信服务并开通 打开短信服务的管理台 在国内消息那栏中添加签名管理和模板管理(按照格式要求去写) 在右上角 ...

  8. SpringBoot:4.SpringBoot整合Mybatis实现数据库访问

    在公司项目开发中,使用Mybatis居多.在 SpringBoot:3.SpringBoot使用Spring-data-jpa实现数据库访问 中,这种jpa风格的把sql语句和java代码放到一起,总 ...

  9. SpringMVC学习系列(6) 之 数据验证

    在系列(4).(5)中我们展示了如何绑定数据,绑定完数据之后如何确保我们得到的数据的正确性?这就是我们本篇要说的内容 —> 数据验证. 这里我们采用Hibernate-validator来进行验 ...

随机推荐

  1. P1319 【压缩技术】

    题面嘤嘤嘤 刚做完P1320,突然发现这里有一个没有括号的压缩技术,就抱着试一试的心态来做一做... 洛谷真有趣,让我正着做一遍,反着做一遍... 好,进入正题 这题比较便捷的是边读边做 具体细节看代 ...

  2. 吴恩达机器学习(四) 使用Octave

    一.基本操作 本课程有编程作业,编程作业需要使用Matlab或Octave,本文章使用Octave.下载地址:http://www.gnu.org/software/octave/#install.安 ...

  3. 结构体封装高精度 大整数BigInt

    曾经很讨厌高精度,因为它很长,不好记,而且在不是很单纯的题目里面感觉很烦(一个数就是一个数组).在一道题目中出现的时候总是用一些奇技淫巧混过去(比如把两个$long$ $long$拼在一起). 现在. ...

  4. spring boot-11.全局捕获异常

    1.在Spring boot 中如果发生错误,浏览器访问会默认跳转到Whitelabel Error Page 这个错误页面,如果是客户端访问的话返回JSON格式的错误数据,说明spring boot ...

  5. luogu 黑题 P3724大佬

    #include<bits/stdc++.h> using namespace std; #define ll long long #define RG register #define ...

  6. Head First PHP&MySQl第四章代码

    addemail.php <!DOCTYPE html> <html lang="cn" dir="ltr"> <head> ...

  7. com.mysql.cj.exceptions.InvalidConnectionAttributeException: The server time zone value 'PDT' is.......

    SpringBoot连接数据库的时候报错 java.sql.SQLException: The server time zone value 'PDT' is unrecognized or repr ...

  8. AndroidStudio Gradle手动下载和安装

    操作流程概述: 下载好的压缩包和解压后的文件夹复制到gradle-5.5.1-all --->97z1ksx6lirer3kbvdnh7jtjg文件夹下,将gradle-5.5.1-all.zi ...

  9. AIX中的进程管理

    1.AIX中的进程 (1)后台进程 后台进程运行时,用户不必等待当前后台进程的结束,即可以运行下一个进程. 后台进程的运行方式: # command &   (2)提高进程优先等级 -- ni ...

  10. 批量恢复zencart产品表所属分类master_categories_id为0的产品

    批量恢复zencart产品表所属分类master_categories_id为0的产品 将下面代码保存为master_categories_id.php,上传到网站根目录运行即可,操作前先备份数据库 ...