2015-05-02 65 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