gpt4 book ai didi

java - 在 WebFilter 类中抛出异常并在 ControllerAdvice 类中处理

转载 作者:行者123 更新时间:2023-12-05 01:17:26 30 4
gpt4 key购买 nike

我正在尝试实现一个 WebFilter 来检查 JWT 并在检查失败或结果无效时抛出异常。我有一个处理这些异常的 @ControllerAdvice 类。但它不起作用。

这是 WebFilter 类:

@Component
public class OktaAccessTokenFilter implements WebFilter {

private JwtVerifier jwtVerifier;

@Autowired
public OktaAccessTokenFilter(JwtVerifier jwtVerifier) {
this.jwtVerifier = jwtVerifier;
}

@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
return Optional.ofNullable(exchange.getRequest().getHeaders().get("Authorization"))
.flatMap(list -> list.stream().findFirst())
.filter(authHeader -> !authHeader.isEmpty() && authHeader.startsWith("Bearer "))
.map(authHeader -> authHeader.replaceFirst("^Bearer", ""))
.map(jwtString -> {
try {
jwtVerifier.decodeAccessToken(jwtString);
} catch (JoseException e) {
throw new DecodeAccessTokenException();
}
return chain.filter(exchange);
}).orElseThrow(() -> new AuthorizationException());
}
}

以及异常处理程序:

@ControllerAdvice
public class SecurityExceptionHandler {

@ExceptionHandler(AuthorizationException.class)
public ResponseEntity authorizationExceptionHandler(AuthorizationException ex) {

return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();

}

@ExceptionHandler(DecodeAccessTokenException.class)
public ResponseEntity decodeAccessTokenExceptionHandler(DecodeAccessTokenException ex) {

return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();

}

}

我认为,@ControllerAdvice 类无法处理 WebFilter 抛出的异常。因为,如果我将异常移动到 Controller ,它就可以工作。

我已经更改了代码(暂时):

@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {

Optional<String> authJwt = Optional.ofNullable(exchange.getRequest().getHeaders().get("Authorization"))
.flatMap(list -> list.stream().findFirst())
.filter(authHeader -> !authHeader.isEmpty() && authHeader.startsWith("Bearer "))
.map(authHeader -> authHeader.replaceFirst("^Bearer", ""));

if (authJwt.isPresent()) {
String jwtString = authJwt.get();
try {
jwtVerifier.decodeAccessToken(jwtString);
} catch (JoseException e) {
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().writeWith(Mono.empty());
}
} else {
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().writeWith(Mono.empty());
}

return chain.filter(exchange);
}

你怎么看这个问题?你知道另一种实现方式吗?

最佳答案

您可以尝试为您的 @ControllerAdvice@WebFilter bean 定义一个 @Order(),并提供 @ControllerAdvice 更高的优先级。

但是,我不认为这是要走的路,主要原因是 @ControllerAdvice 异常处理程序不返回 react 类型。相反,我会定义一个实现 ErrorWebExceptionHandler 的 bean。这个处理程序是由 spring-webflux 添加到响应流中的,所以你不需要担心优先级。见 this answer了解详情。

关于java - 在 WebFilter 类中抛出异常并在 ControllerAdvice 类中处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50542300/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com