spring-boot整合validate

本文详细介绍了如何在Spring Boot项目中整合Hibernate Validate进行后端数据验证,包括在Controller中进行验证、国际化、分组校验、自定义校验规则以及全局异常拦截器的使用。还列举了常用的校验注解及其作用。
摘要由CSDN通过智能技术生成

spring-boot整合validate

在Contrller中进行验证

创建spring-boot整合validate工程,在Controller中验证形参

springboot版本是2.0.0.RELEASE已经内置hibernate validate好的,隶属于jsr303规范

官网:(以官网为准)

http://hibernate.org/validator/

api doc

https://docs.jboss.org/hibernate/stable/validator/api/

创建工程,添加依赖

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-devtools</artifactId>
</dependency>
<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
</dependency>

spring-boot-starter-web已将依赖添加了

<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-validator</artifactId>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
</dependency>

测试在不进行验证时候的返回值

编写Controler代码

@RestController
@RequestMapping("validate")
@Slf4j
public class ValidateController {
  @RequestMapping("validate")
  public String validateTest(String address) {
    log.info("address={}", address);
    return "success";
  }
}

访问http://localhost:8080/validate/validate返回如下

{
  "timestamp": "2019-11-20T08:06:15.728+0000",
  "status": 400,
  "error": "Bad Request",
  "message": "Required String parameter 'address' is not present",
  "path": "/user/validate"
}

访问http://localhost:8080/validate/validate?address返回success

测试在进行进行验证的时候的返回值

请求方法中的请求参数上直接添加验证规则 如:@NotNull ,需要在该类上面需要添加@Validated

import org.hibernate.validator.constraints.NotBlank;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import lombok.extern.slf4j.Slf4j;

@RestController
@RequestMapping("validate")
@Slf4j
@Validated
public class ValidateController {
  @RequestMapping("validate")
  public String validateTest(@NotBlank(message = "地址不能为空!") String address) {
    log.info("address={}", address);
    return "success";
  }
}

再次访问http://localhost:8080/validate/validate?address如下.成功的进行了验证

{
  "timestamp": "2019-11-20T08:13:53.382+0000",
  "status": 500,
  "error": "Internal Server Error",
  "message": "validateTest.address: 地址不能为空!",
  "path": "/user/validate"
}

验证实体类

编写一个实体类,@Past验证生日字段

import java.util.Date;
import javax.validation.constraints.Past;
import org.springframework.format.annotation.DateTimeFormat;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;

@Data
public class User {
  private String name;
  @Past(message = "生日必须是一个过去的日期")
  @JsonFormat(pattern = "yyyy/MM/dd", timezone = "GMT+8")
  @DateTimeFormat(pattern = "yyyy/MM/dd")
  private Date birthday;
}

 

在Controller中进行验证

Contrller的类上添加@Validated,方法的形参的实体类上添加@Valid注解,后面紧跟着BindingResult result(必须强制性的),校验的结果放在了result中。

import javax.validation.Valid;

import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.biillrobot.study.spring.validte.dataobject.User;

import lombok.extern.slf4j.Slf4j;

@RestController
@RequestMapping("user")
@Slf4j
@Validated
public class UserController {
  @RequestMapping("add")
  public String add(@Valid User user, BindingResult result) {
    log.info("user={}", user);
    return "success";
  }
}

测试访问

http://localhost:8080/user/add?name=l

Spring Security和JWT(JSON Web Token)可以很好地结合使用,以提供安全的身份验证和授权机制。 首先,你需要在你的Spring项目中添加Spring Security和JWT的依赖。例如,在Maven项目中,你可以在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.1</version> </dependency> ``` 接下来,在Spring Security的配置类中,你可以定义一个JwtTokenProvider类,该类负责生成JWT并进行验证。 ```java @Component public class JwtTokenProvider { private static final String SECRET_KEY = "your-secret-key"; private static final long EXPIRATION_TIME = 86400000; // 24 hours public String generateToken(Authentication authentication) { UserDetails userDetails = (UserDetails) authentication.getPrincipal(); Date now = new Date(); Date expiryDate = new Date(now.getTime() + EXPIRATION_TIME); return Jwts.builder() .setSubject(userDetails.getUsername()) .setIssuedAt(now) .setExpiration(expiryDate) .signWith(SignatureAlgorithm.HS512, SECRET_KEY) .compact(); } public boolean validateToken(String token) { try { Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token); return true; } catch (SignatureException ex) { System.out.println("Invalid JWT signature"); } catch (MalformedJwtException ex) { System.out.println("Invalid JWT token"); } catch (ExpiredJwtException ex) { System.out.println("Expired JWT token"); } catch (UnsupportedJwtException ex) { System.out.println("Unsupported JWT token"); } catch (IllegalArgumentException ex) { System.out.println("JWT claims string is empty"); } return false; } public String getUsernameFromToken(String token) { Claims claims = Jwts.parser() .setSigningKey(SECRET_KEY) .parseClaimsJws(token) .getBody(); return claims.getSubject(); } } ``` 在上述代码中,SECRET_KEY是用来签署和验证JWT的密钥,EXPIRATION_TIME表示JWT的有效期。 然后,在Spring Security的配置类中,你可以继承WebSecurityConfigurerAdapter类,并重写configure(HttpSecurity http)方法来配置安全规则和JWT的使用。 ```java @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private JwtTokenProvider jwtTokenProvider; @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable() .authorizeRequests() .antMatchers("/api/auth/**").permitAll() .anyRequest().authenticated() .and() .apply(new JwtConfigurer(jwtTokenProvider)); } } ``` 上述代码中,我们对`/api/auth/**`路径下的请求进行了放行,其他请求需要进行身份验证。JwtConfigurer类用于配置JWT的过滤器。 最后,你可以创建一个控制器来处理用户身份验证和生成JWT的请求。 ```java @RestController @RequestMapping("/api/auth") public class AuthController { @Autowired private JwtTokenProvider jwtTokenProvider; @Autowired private AuthenticationManager authenticationManager; @PostMapping("/login") public ResponseEntity<?> login(@RequestBody LoginRequest loginRequest) { Authentication authentication = authenticationManager.authenticate( new UsernamePasswordAuthenticationToken(loginRequest.getUsername(), loginRequest.getPassword()) ); SecurityContextHolder.getContext().setAuthentication(authentication); String token = jwtTokenProvider.generateToken(authentication); return ResponseEntity.ok(new JwtAuthenticationResponse(token)); } } ``` 在上述代码中,我们使用AuthenticationManager来验证用户的用户名和密码,并生成JWT。JwtAuthenticationResponse类可以用来返回JWT给客户端。 以上就是Spring Security和JWT整合的简单示例。你可以根据自己的需求进行修改和扩展。希望对你有所帮助!如果你还有其他问题,请随时提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值