2014-02-09 57 views
3

在我的Spring MVC應用程序(servlet的3.0),我已經在web.xml中定義自定義錯誤處理程序:不是Tomcat的自定義錯誤處理程序捕獲的Spring MVC攔截器的錯誤響應

<error-page> 
    <location>/error</location> 
</error-page> 

映射到一個控制器:

@Controller 
class CustomErrorController { 

@RequestMapping("error") 
public String customError(HttpServletRequest request, HttpServletResponse response, Model model) { 
... 
} 
} 

這適用於大多數錯誤,如404錯誤。 不過,我還定義它返回一個403響應的攔截,如果沒有身份驗證的用戶:

@Override 
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 
    HttpSession httpSession = request.getSession(); 
    ((HttpServletResponse) response).setStatus(HttpURLConnection.HTTP_FORBIDDEN); 
    return false; 
} 

403響應由自定義錯誤處理程序捕獲 - 瀏覽器只會越來越沒有響應錯誤代碼403.

我認爲這是因爲我在攔截器中做了一些不正確的事情 - 如何更改Interceptor中的代碼以便正常的錯誤處理工作?

+0

如何將錯誤代碼附加到錯誤頁面? –

回答

9

變化response.setStatusresponse.sendError

@Override 
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 
    response.sendError(HttpServletResponse.SC_FORBIDDEN); 
    return false; 
} 

這實際上發出一個錯誤(而不是僅僅說明它) - 和部隊Tomcat使用作爲web.xml

定義爲HttpServletResponse#setStatus(int) javadoc指出錯誤位置

如果此方法[setStatus]用於設置錯誤代碼,那麼容器的錯誤頁面機制將會不會被觸發。如果出現錯誤並且調用者希望調用Web應用程序中定義的錯誤頁面,則必須使用sendError(int,java.lang.String)。

相關問題