2015-05-02 130 views
2

@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()); 
    } 

UPDATE

我的要求是具有弹性安全领域的全球异常处理程序过滤器。有什么办法可以做到吗?

+0

这些错误由Spring Security处理,而不是由@ ExceptionHandler处理,因为这些错误仅适用于控制器,并且在DispatcherServlet过滤器内执行,因此绝不会将'@ ExceptionHandler'移动到另一个过滤器,基本上将dispatcherservlet复制到过滤器)可以处理这个(也不应该是imho)。你也知道你的自定义过滤器有缺陷吗? –

+0

那么是否有办法在全球范围内处理弹簧安全异常?不,不是,缺点是什么? – Kaushik

+0

Spring Security已经处理了这些异常,那有什么问题?您有一个过滤器,并且对于每个请求,您将结果存储在一个类级别属性中,'loginDTO'现在您认为10个请求进来后会发生什么...... –

回答

1

恐怕你不能。这里是(广义)的请求是如何在一个Spring MVC Web应用程序处理:

servlet container 
    filters before FilterChain.doFilter 
     DispatcherServlet => here is all Spring MVC machinery 
    filters after FilterChain.doFilter 
servlet container 

所有的Spring MVC机械是DispatcherServlet的内部管理,包括所有的异常处理。

恕我直言,你可以尝试两件事情:

  • 用一个拦截器(*)
  • 使用其他过滤器的一个地方抛出异常之前来了,抓住它有(非Spring MVC的更换滤芯方式,但过滤器 Spring MVC的以外)

(*),你仍然会无法使用的ExceptionHandler,因为异常将控制器之外被抛出,但你可以使用一个HandlerExceptio nResolver。

+0

我尝试了两种建议,HandlerExceptionResolver对我来说并不适合,但添加一个Filter就像一个魅力。谢谢。 – Kaushik