SpringBoot整合Hibernate-invalidate(JSR303校验)

1、简介

Hibernate-invalidate的作用简单来说就是:做参数的验证,验证前端传入的参数是否合法

Hibernate-invalidator这个框架跟 Hibernate并没有什么关系、是一个独立的框架

SpringBoot默认使用该验证规则,不需要额外导入依赖

2、对象参数的校验

2.1、定义对象
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {

    private Integer id;

    @NotNull(message = "用户名不能为空")
    @Length(min = 6, max = 10, message = "用户名长度只能是 6~10 位")
    private String name;

    @NotNull(message = "密码不能为空")
    @Length(min = 6, max = 10, message = "密码只能是 6~10 位")
    private String password;

    @NotNull(message = "年龄不能为空")
//    @Pattern(regexp = "\\d", message = "只能是数字")
    @Range(min = 16, max = 40, message = "年龄必须在16~40之间")
    private Integer age;
}
2.2、定义controller
@RestController
public class UserController {

    private Logger logger = LoggerFactory.getLogger(UserController.class);

    @GetMapping("test1")
    public String test1(@Valid User user, BindingResult bindingResult) {
        // 判断校验是否出错,如果有错则返回true
        if (bindingResult.hasErrors()) {
            // 获取所有的校验错误的信息
            List<FieldError> fieldErrors = bindingResult.getFieldErrors();
            for (FieldError fieldError : fieldErrors) {
                String field = fieldError.getField();   // 错误的字段名
                String message = fieldError.getDefaultMessage(); // 错误的详细信息
                logger.info("错误的字段名:" + field + "  ;错误的信息为:" + message);
            }
        }
        return "测试validator验证规则:@Valid-对象参数-user: " + user;
    }

    @GetMapping("test2")
    public String test2(@Validated(Register.class) User user, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            List<FieldError> fieldErrors = bindingResult.getFieldErrors();
            for (FieldError fieldError : fieldErrors) {
                String field = fieldError.getField();
                String message = fieldError.getDefaultMessage();
                logger.info("错误的字段名:" + field + "  ;错误的信息为:" + message);
            }
        }
        return "测试validator验证规则:@Validated(Register.class)-对象参数-user: " + user;
    }

    @GetMapping("test3")
    public String test3(@Validated(Login.class) User user, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            List<FieldError> fieldErrors = bindingResult.getFieldErrors();
            for (FieldError fieldError : fieldErrors) {
                String field = fieldError.getField();
                String message = fieldError.getDefaultMessage();
                logger.info("错误的字段名:" + field + "  ;错误的信息为:" + message);
            }
        }
        return "测试validator验证规则:@Validated(Login.class)-对象参数-user: " + user;
    }
}

3、方法参数的校验

3.1、写配置文件支持单个参数的校验
 	/**
     * 开启Hiberante-invalidator对方法单个参数校验的支持
     * @return
     */
    @Bean
    public MethodValidationPostProcessor methodValidationPostProcessor(){
        return new MethodValidationPostProcessor();
    }
3.2、在校验的类上添加如下的注解
@Validated  	
3.3、编写要校验的方法
@RestController
@Validated
public class ParamController {

    Logger logger = LoggerFactory.getLogger(ParamController.class);

    @GetMapping("param1")
    public String param1(@NotNull(message = "账号不能为空") @Length(min = 3, max = 6, message = "账号只能是3~6位") String account,
                         @NotNull(message = "密码不能为空") @Length(min = 6, max = 10, message = "账号只能是6~10位") String password) {
        
        return "测试:验证方法参数:普通参数;account: " + account + "  password: " + password;
    }
}
3.4、全局异常处理器
  • 此方法不能直接返回异常结果,只能自己处理异常,需要配合自定义全局异常处理器处理

  • 全局异常处理器

    /**
     * 配置全局异常解析器
     */
    @ControllerAdvice
    public class CommonExceptionHandler {
    
        /**
         * 处理 JSR303 校验不通过异常
         */
        @ExceptionHandler(ConstraintViolationException.class)
        @ResponseBody
        public String constraintViolationException(ConstraintViolationException exception) {
            // 验证不通过的信息
            Iterator<ConstraintViolation<?>> iterator = exception.getConstraintViolations().iterator();
            StringBuilder str = new StringBuilder();
            while(iterator.hasNext()){
                str.append(iterator.next().getMessage());
                str.append("\n");
            }
            return "参数校验失败,错误信息为:" + str.toString();
        }
    }
    
  • 校验失败的异常均为:ConstraintViolationException

4、Hibernate-invalidator的校验模式

4.1、普通模式的校验

就是所有的字段都要校验、而且校验不通过的 都要返回这个校验错误的信息

4.2、快速校验模式

只要校验中一个没通过、后面的就不用校验了

下面就是配置校验模式

配置文件中

 	/**
     * 配置校验的规则 是普通校验还是快速校验
     *      此项一般不配,使用默认值普通校验
     */
    @Bean
    public Validator validator() {
        ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)
                .configure()
                .addProperty("Hibernate.validator.fail_fast", "false") // true 快速校验模式;false(默认值) 普通校验模式
                // .failFast( true )    和上一行等价
                .buildValidatorFactory();
        return validatorFactory.getValidator();
    }

5、分组校验

5.1、创建分组(空接口即可)
public interface Login {
}

public interface Register {
}
5.2、在方法上表明当前这个方法属于哪一个组
	@GetMapping("test2")
    public String test2(@Validated(Register.class) User user, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            List<FieldError> fieldErrors = bindingResult.getFieldErrors();
            for (FieldError fieldError : fieldErrors) {
                String field = fieldError.getField();
                String message = fieldError.getDefaultMessage();
                logger.info("错误的字段名:" + field + "  ;错误的信息为:" + message);
            }
        }
        return "测试validator验证规则:@Validated(Register.class)-对象参数-user: " + user;
    }

    @GetMapping("test3")
    public String test3(@Validated(Login.class) User user, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            List<FieldError> fieldErrors = bindingResult.getFieldErrors();
            for (FieldError fieldError : fieldErrors) {
                String field = fieldError.getField();
                String message = fieldError.getDefaultMessage();
                logger.info("错误的字段名:" + field + "  ;错误的信息为:" + message);
            }
        }
        return "测试validator验证规则:@Validated(Login.class)-对象参数-user: " + user;
    }
5.3、在对象上标明当前属性需要在哪些分组做校验
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {

    private Integer id;

    @NotNull(message = "用户名不能为空")
    @Length(min = 6, max = 10, message = "用户名长度只能是 6~10 位", groups = {Register.class, Login.class})
    private String name;

    @NotNull(message = "密码不能为空")
    @Length(min = 6, max = 10, message = "密码只能是 6~10 位", groups = {Register.class, Login.class})
    private String password;

    @NotNull(message = "年龄不能为空", groups = {Register.class})
//    @Pattern(regexp = "\\d", message = "只能是数字", groups = {Register.class})
    @Range(min = 16, max = 40, message = "年龄必须在16~40之间", groups = {Register.class})
    private Integer age;
}

6、常见的注解

@Null 元素必须为null
@NotNull 元素不能为null
@AssertTrue 元素的值必须为true
@Assertfalse 元素必须为false
@Min | @DecimalMin :元素的值必须是一个数字  这个数字 的值必须大于等于最小值
@Max | @DecimalMax : 元素的值必须是一个数字  这个数字 的值必须小于等于最大值
@Size :表示的是元素的大小在指定的范围内
@Past :表示的是元素的值 必须是一个过期的时间
@Future:表示的是元素的值 必须在一个将来的时间
@Pattern(rex=xxx) :正则表达式判断的
@Notblack 字符串非null 长度必须大于0
@Email :邮箱判断
@length :长度判断
@NotEmpty :字符串非空
@Range :表示的是元素必须在指定的范围内

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是 Spring Boot 整合 SAML 的基本代码示例: 1. 添加依赖 在 pom.xml 文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.security.extensions</groupId> <artifactId>spring-security-saml2-core</artifactId> <version>1.0.10.RELEASE</version> </dependency> ``` 2. 配置 SAML 在 application.properties 文件中添加以下配置: ```properties # SAML 配置 security.saml2.metadata-url=http://idp.example.com/metadata security.saml2.entity-id=http://sp.example.com/metadata security.saml2.key-store=file:/path/to/keystore.jks security.saml2.key-store-password=keystore_password security.saml2.key-password=key_password security.saml2.default-success-url=/success security.saml2.login-processing-url=/saml/login security.saml2.logout-url=/saml/logout ``` 其中,metadata-url 是 Identity Provider 的元数据 URL,entity-id 是 Service Provider 的实体 ID,key-store 是密钥库文件路径,key-store-password 是密钥库密码,key-password 是密钥密码。 3. 配置 Spring Security 创建一个继承 WebSecurityConfigurerAdapter 的类,并在其中配置 Spring Security: ```java @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private SAMLUserDetailsService samlUserDetailsService; @Autowired private SAMLAuthenticationProvider samlAuthenticationProvider; @Autowired private SAMLConfigurer samlConfigurer; @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/saml/**").permitAll() .anyRequest().authenticated() .and() .apply(samlConfigurer); } @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth .authenticationProvider(samlAuthenticationProvider); } @Bean public SAMLConfigurer samlConfigurer() { return new SAMLConfigurer(); } @Bean public SAMLAuthenticationProvider samlAuthenticationProvider() { SAMLAuthenticationProvider provider = new SAMLAuthenticationProvider(); provider.setUserDetails(samlUserDetailsService); provider.setForcePrincipalAsString(false); return provider; } @Bean public SAMLUserDetailsService samlUserDetailsService() { return new SAMLUserDetailsServiceImpl(); } } ``` 其中,samlUserDetailsService 是一个实现 SAMLUserDetailsService 接口的类,用于加载用户信息。 4. 创建 SAML Controller 创建一个 SAML Controller,用于处理 SAML 相关请求: ```java @Controller @RequestMapping("/saml") public class SamlController { @GetMapping("/login") public void login(HttpServletRequest request, HttpServletResponse response) throws Exception { AuthenticationManager authenticationManager = getAuthenticationManager(); SAMLAuthenticationToken token = new SAMLAuthenticationToken(null, null); Authentication authentication = authenticationManager.authenticate(token); SecurityContextHolder.getContext().setAuthentication(authentication); response.sendRedirect("/"); } @GetMapping("/logout") public void logout(HttpServletRequest request, HttpServletResponse response) throws Exception { request.getSession().invalidate(); response.sendRedirect("/"); } private AuthenticationManager getAuthenticationManager() { AuthenticationManager authenticationManager = new ProviderManager(List.of(samlAuthenticationProvider())); return authenticationManager; } @Autowired private SAMLAuthenticationProvider samlAuthenticationProvider; } ``` 其中,login 方法用于处理 SAML 登录请求,logout 方法用于处理 SAML 登出请求。 5. 启动应用程序 启动应用程序,并访问 http://localhost:8080/saml/login 进行 SAML 登录。登录成功后,将重定向到 http://localhost:8080/success 页面。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值