春季启动中自定义验证中的网络调用



我需要验证RESTApi中的许多字段。有没有具体的模式可以做到这一点?我的api充斥着这些验证调用。

  1. 针对另一个服务检查http请求中的auth令牌以验证访问权限。

  2. 通过调用另一个服务来验证请求主体中的一些字段,如类别、类型等。

  3. 泛型null&空支票。目前我正在使用spring验证来完成这项工作。

针对另一个服务检查http请求中的auth令牌,以验证访问权限

我建议在请求到达控制器之前在过滤器中验证令牌。

像这样的

  1. 创建一个新的令牌验证筛选器
@Component
public class TokenValidationFilter extends OncePerRequestFilter {
private TokenValidationService tokenValidationService;

@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
throws ServletException, IOException {

final String authorizationHeader = request.getHeader("Authorization");

boolean isValid = tokenValidationService.validate(authorizationHeader);
//do authentication here 
chain.doFilter(request, response);
}
}

将过滤器添加到http过滤器

public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class); // this just an example you might needed to added before a different filter 
}
}

通过调用另一个服务来验证请求主体中的一些字段,如类别、类型等。

Spring允许创建自定义约束。参见春季文档。

示例:UniqueUsername接口

@Documented
@Constraint(validatedBy = UniqueUsernameValidator.class)
@Target( { ElementType.METHOD, ElementType.FIELD,ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
public @interface UniqueUsername {
String message() default "username is not unique";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
public class UniqueUsernameValidator implements ConstraintValidator<UniqueUsername, UserDto> {
private final UserService usersService;
@Override
public void initialize(UniqueUsername constraintAnnotation) {
}
@Override
public boolean isValid(UserDto value, ConstraintValidatorContext context) {
return usersService.isUnique(value.getUsername());
}
}

用户dto:


@UniqueUsername(message = "Username is used")
public class UserDto {
@DecimalMin(value = "0")
private long id;
@NotBlank(message = "Username can not be blank")
private String username;
}

请注意,约束可以是类级别(如UniqueUsername(或字段级别(如NotBlank(。

泛型null&空支票。目前我正在使用spring验证来完成这项工作。

弹簧验证/约束是正确的。

最新更新