前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Spring Security(使用hibernate-validator)

Spring Security(使用hibernate-validator)

作者头像
用户7386338
发布于 2020-05-29 08:09:29
发布于 2020-05-29 08:09:29
1.1K00
代码可运行
举报
文章被收录于专栏:Java患者Java患者
运行总次数:0
代码可运行

Hibernate-Validator介绍

hibernate-validator是Hibernate项目中的一个数据校验框架,是Bean Validation 的参考实现。使用hibernate-validator能够将数据校验从业务代码中脱离出来,增加代码可读性,同时也让数据校验变得更加方便、简单。如果参数不能通过校验,报400错误,请求格式不正确。

在使用hibernate-validator之前,我们需要引入相应的jar包

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-validator</artifactId>
      <version>6.0.9.Final</version>
</dependency>

相关注解

@Null

必须为null

@NotNull

不能为null

@AssertTrue

必须为true

@AssertFalse

必须为false

@Min

必须为数字,其值大于或等于指定的最小值‍‍

@Max

必须为数字,其值小于或等于指定的最大值‍

@DecimalMin

必须为数字,其值大于或等于指定的最小值

@DecimalMax

必须为数字,其值小于或等于指定的最大值

@Size

集合的长度

@Digits

必须为数字,其值必须再可接受的范围内

@Past

必须是过去的日期

@Future

必须是将来的日期

@Pattern

必须符合正则表达式

@Email

必须是邮箱格式

@Length

长度范围

@NotEmpty

不能为null,长度大于0

@Range

元素的大小范围

@NotBlank

不能为null,字符串长度大于0(限字符串)

@Pattern(regex=)

字符串必须匹配正则表达式

注意:DecimalXX可以对字符串的数字进行校验。

Hibernate-validator使用

假设我们一个更新用户信息的接口,需要使用User对象进行接收参数,并且要求密码不能为空,生日必须是过去的时间。这时可以在User类中给这2个属性加上对应的注解。如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@NotBlank(message = "密码不能为空")
private String password;
@Past(message = "生日必须是过去的时间")
private Date birthday;

如果需要校验的参数位于请求体中,那么在验证请求参数时,在User user前面加注解 @Valid。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  @PutMapping("/{id:\\d+}")
  public User update(@RequestBody @Valid User user, BindingResult errors) {
      if(errors.hasErrors()) {
          // may not be empty错误信息。后面我们会学如何自定义
          errors.getAllErrors().stream().forEach(error -> {
              FieldError fieldError = (FieldError) error;
              String message = fieldError.getField() + error.getDefaultMessage();
              System.out.println(message);
          });
      }
      user.setId("1");
      return user;
  }

当我们参数传过来以后。数据会根据对象中的注解,对数据的合法性进行一个校验,校验后的信息会被封装到一个BindingResult的对象里,作为方法的参数传进来。我们可以利用BindingResult对象包装错误消息放回前端,让他们知道哪些字段有什么错误。

如果对象内部包含另一个对象作为属性,那么我们在对象的属性上加@Valid,可以验证作为属性的对象内部的验证。

自定义校验器

有时候,我们需要对特殊的字段做特定的校验,那么我们就可以自定义校验器。下面我们来创建一个@MyConstraint的校验注解。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Target({ElementType.METHOD,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
// 
@Constraint(validatedBy = MyConstraintValidator.class)
public @interface MyConstraint {
    // 必须要有的三个属性
    String message();
    Class<?>[] groups() default { };
    Class<? extends Payload>[] payload() default { };
}

我们的校验逻辑是写在校验逻辑写在MyConstraintValidator这个类上面,它需要实现ConstraintValidator的接口。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class MyConstraintValidator implements ConstraintValidator<MyConstraint,Object> {

    @Override
    public void initialize(MyConstraint constraintAnnotation) {
        System.out.println("初始化做的工作");
    }

    @Override
    public boolean isValid(Object value, ConstraintValidatorContext context) {
        return false;
    }
}

这个接口需要指定二个泛型,第一个是我们校验的注解类。第二个指定我们要对什么类型进行校验。initialize方法是初始化时候调用的。isValid是校验的时候用的,isValid方法返回true表示校验通过,返回false表示校验不通过。

在Spring的项目中,允许在这个类中注入Spring的东西,如使用@Autowired注解注入Bean对象。

在User类中对username字段使用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@MyConstraint(message = "这是一个测试")
private String username;
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java患者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Spring Validation
Spring 为了给开发者提供便捷,对 hibernate validation 进行了二次封装,显示校验 validated bean 时,可以使用 spring validation 或者 hibernate validation。
数媒派
2022/12/01
4530
强悍的Spring之spring validation
数据的校验是交互式网站一个不可或缺的功能,前端的js校验可以涵盖大部分的校验职责,如用户名唯一性,生日格式,邮箱格式校验等等常用的校验。但是为了避免用户绕过浏览器,使用http工具直接向后端请求一些违法数据,服务端的数据校验也是必要的,可以防止脏数据落到数据库中,如果数据库中出现一个非法的邮箱格式,也会让运维人员头疼不已。可以使用本文将要介绍的validation来对数据进行校验。
你呀不牛
2021/05/28
4170
Spring MVC 你必须关注点
Spring MVC配置简单,特别是在SpringBoot出现后基本都是开箱即用。在实际项目中通常是需要单独去处理一些特殊的情况,比如统一的异常处理,校验器以及国际化。
李鸿坤
2020/07/23
7270
SpringMVC笔记(10):数据校验
Spring MVC提供了两种数据校验的方式:1.基于Validator接口,2.使用Annotaion JSR-303标准进行校验。
南风
2018/12/27
9921
SpringMVC教程4[服务器端校验]
如果属性文件乱码的解决办法: 在Eclipse主界面下,打开Window->Perferences->General->ContentTypes:
用户4919348
2019/04/02
4620
SpringMVC教程4[服务器端校验]
SpringMVC参数校验
我们在做Web层的时候,接收了各种参数,尽管前端已经做了验证,但难免恶意传参,所以要对传过来的数据保持不信任的态度来进行参数校验
晚上没宵夜
2020/03/10
1.1K0
Validator 使用总结
正文: 介绍 首先说下大家常用的hibernate-validator,它是对JSR-303/JSR-349标准的实现,然后spring为了给开发者提供便捷集成了 hibernate-validator,默认在springmvc模块。 依赖 本文所介绍皆在springboot应用的基础上,首先加上web模块: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</arti
itliusir
2018/05/21
4780
Hibernate Validator 数据校验框架
JSR303是专家组成员向JCP提交的第1版Bean Validation,即针对bean数据校验提出的一个规范,使用注解方式实现数据校验。后面有升级版本JSR349及JSR380。
冬天vs不冷
2025/01/21
1940
Hibernate Validator 数据校验框架
一文弄懂spring validate​
校验参数在以前基本都是使用大量的if/else,稍微方便一点的可以使用反射+自定义注解的形式,但是复用性不是很好,并且每个人对于的自定义注解有着自己的使用习惯,不过好在spring开发了validated框架用于注解校验,可以节省很多的校验ifelse代码,这篇文章通篇介绍了如何使用spring validated。
阿东
2021/08/16
3.7K0
Spring Security技术栈开发企业级认证与授权(三)表单校验以及自定义校验注解开发
首先我们需要在项目的POM文件中添加Hibernate Validator的依赖才可以使用它的数据校验器进行数据校验。由于Spring Boot已经将Hibernate Validator集成到了spring-boot-starter-web包里,所以这里不需要额外引用Hibernate Validator依赖。常用的校验注解下表所示:
itlemon
2020/04/03
6380
JSR303后端校验详解
JSR 303 - Bean Validation提供了一种后端数据校验支持,如果一键f12修改前端代码成功绕过前端校验,那么就会存入非法数据,所以后端校验十分重要。应该前端+后端+数据库的校验约束都不能少,全面保障数据规范安全。
唔仄lo咚锵
2020/09/15
7950
JSR303校验+统一异常处理细节+同一字段多个校验注解的结果如何处理
现在我们使用下面这个异常处理来处理对前端传来的数据RegisterVO 进行校验的结果。当数据校验失败时,会抛出异常,会抛出哪个异常呢,我们先直接使用Exception.class来接收,使用它总是没错的。
vivi
2021/01/26
1.8K0
JSR303校验+统一异常处理细节+同一字段多个校验注解的结果如何处理
Java 参数校验(Validator)
应用在执行业务逻辑之前,必须通过校验保证接受到的输入数据是合法正确的,但很多时候同样的校验出现了多次,在不同的层,不同的方法上,导致代码冗余,浪费时间,违反DRY原则。
郭顺发
2021/12/17
1.5K0
springboot validation参数校验
其中在spring-boot-starter-web中有hibernate-validater的依赖。
山行AI
2019/08/26
3.8K0
springboot validation参数校验
SpringMVC03之拦截器和JSR303
        3.3 在请求处理方法中,使用@Validated或@Valid注解要验证的对象,并根据BindingResult判断校验是否通过。另外,验证参数后必须紧跟BindingResult参数,否则spring会在校验不通过时直接抛出异常
天蝎座的程序媛
2022/11/18
4530
SpringMVC03之拦截器和JSR303
java之Springmvc请求参数校验@Validated
SpringMVC支持的数据校验是JSR303的标准,通过在bean的属性上打上@NotNull、@Max等进行验证。JSR303提供有很多annotation接口,而SpringMVC对于这些验证是使用hibernate的实现,所以我们需要添加hibernate的一个validator包:
IT工作者
2022/05/17
1.5K0
SpringBoot整合JSR303实现参数校验
不知不觉Spring Boot专栏文章已经写到第十四章了,无论写的好与不好,作者都在尽力写的详细,写的与其它的文章不同,每一章都不是浅尝辄止。如果前面的文章没有看过的朋友,点击这里前往。
爱撒谎的男孩
2020/10/29
3K0
springboot使用hibernate validator校验
一、参数校验  在开发中经常需要写一些字段校验的代码,比如字段非空,字段长度限制,邮箱格式验证等等,写这些与业务逻辑关系不大的代码个人感觉有两个麻烦: 验证代码繁琐,重复劳动 方法内代码显得冗长 每次要看哪些参数验证是否完整,需要去翻阅验证逻辑代码 hibernate validator(官方文档)提供了一套比较完善、便捷的验证实现方式。 spring-boot-starter-web包里面有hibernate-validator包,不需要引用hibernate validator依赖。 二、hiberna
庞小明
2018/03/07
5.7K0
Spring Security项目Spring MVC开发RESTful API(二)
查询请求 常用注解 @RestController 标明此Controller提供RestAPI @RequestMapping 映射http请求url到java方法 @RequestParam 映射请求参数到java方法到参数 @PageableDefault 指定分页参数默认值 编写一个简单的UserController类 @RestController @RequestMapping(value = "/user") public class UserController { @Req
楠楠
2019/03/20
8120
Spring Security项目Spring MVC开发RESTful API(二)
求求你别在用IF ELSE校验参数了
验证数据是贯穿所有应用程序层(从表示层到持久层)的常见任务。通常在每一层实现相同的验证逻辑,这既费时又容易出错。为了避免重复这些验证,开发人员经常将验证逻辑直接捆绑到域模型中,将域类与验证代码混在一起,这些验证代码实际上是关于类本身的元数据,与业务逻辑不相关。
乱敲代码
2020/12/15
1.8K0
相关推荐
Spring Validation
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文