【发布时间】:2015-07-12 01:22:28
【问题描述】:
在@ControllerAdvice 类中,我有一个@ExceptionHandler,这个处理程序可以很好地处理控制器错误,但是如果我有一个过滤器,它们就无法处理异常。我该如何处理这些异常?
过滤器是:-
public class AuthFilter extends UsernamePasswordAuthenticationFilter {
private LoginDTO loginDTO;
public AuthFilter() {
setRequiresAuthenticationRequestMatcher(
new AntPathRequestMatcher("/login", "POST"));
}
@Override
public Authentication attemptAuthentication(HttpServletRequest request,
HttpServletResponse response) throws AuthenticationException {
try {
loginDTO = new ObjectMapper().readValue(request.getReader(), LoginDTO.class);
} catch (Exception e) {
throw new APIException(ExceptionMessages.INVALID_LOGIN_JSON,
HttpStatus.BAD_REQUEST);
}
return super.attemptAuthentication(request, response);
}
...
}
异常处理程序是(在@ControllerAdvice 中)
@ExceptionHandler(APIException.class)
public ResponseEntity<ErrorDTO> handleAPIException(APIException e) {
return new ResponseEntity<ErrorDTO>(new ErrorDTO(e.getMessage()),
e.getHttpStatus());
}
更新
我的要求是为 spring 安全过滤器提供一个全局异常处理程序。有什么办法吗?
【问题讨论】:
-
这些错误由 Spring Security 处理,而不是由
@ExceptionHandler处理,因为这些错误仅适用于控制器并在DispatcherServlet过滤器中执行,过滤器在过滤器之前执行,所以不可能@ExceptionHandler(不移动它到另一个过滤器,基本上将 dispatcherservlet 复制到一个过滤器)可以处理这个(也不应该恕我直言)。你也知道你的自定义过滤器有缺陷吗? -
那么有没有办法在全球范围内处理 Spring 安全异常?不,不是真的,缺陷是什么?
-
Spring Security 已经处理了这些异常,那有什么问题呢?您有一个过滤器,对于每个请求,您将结果存储在类级别属性中,
loginDTO现在您认为当 10 个请求进入时会发生什么...... -
我想要一条 JSON 错误消息。对于每个请求,它不会创建一个新实例吗?那么解决办法是什么?
-
这是问题,因为此实例存储在过滤器的单个实例中,即共享,因此请求 1 覆盖请求 2。如果您想要 JSON 响应,请创建自定义
ExceptionHandlingFilter。但是你的用例是什么,你为什么要这样做?
标签: java spring spring-security