2016-10-19 28 views
-1

因爲我年輕,所以對於Java EE規範我其實很新。我從來沒有在學校學過這些東西,我正面臨着一種奇怪的行爲,用doFilter方法。doFilter方法可能存在的誤解

考慮以下過濾器:

@WebFilter(filterName = "URLFilter", value = "/test") 
public class URLFilter implements Filter { 

    public void destroy() {} 

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { 
     HttpServletResponse response = (HttpServletResponse) resp; 

     if (response.getStatus() == HttpServletResponse.SC_NOT_FOUND) 
      response.sendRedirect("/"); 

     chain.doFilter(req, resp); 
    } 

    public void init(FilterConfig config) throws ServletException {} 

} 

沒有servlet或存在於/test,在我的瀏覽器頁面,狀態顯然是在訪問URL時,所以應該是價值退還給我一個404 not found錯誤由getStatus()方法不是。 (實際上有一個200狀態碼)

爲什麼我的過濾器沒有按要求將我重定向到/?我是否誤解了一般情況下使用Filters

UPDATE:

我的問題是有關重定向客戶端(使用sendRedirect()),當找不到一個頁面。我不明白過濾器部分,因爲我不知道當chain.doFilter()被調用時,respreq實際上被新數據填充。 (因爲它的doFilter我居然發現了奇怪的是調用由COR模式鏈的下一個過濾器)

我做了一個類繼承HttpServletResponseWrapper,實現了它,它傳遞給過濾器,它現在工作的罰款。

回答

1

您的過濾器在嘗試訪問位於/test的實際資源(servlet,頁面,文件,無論)之前被調用。所以此時響應狀態不能爲404。

然後你的過濾器調用chain.doFilter(),從而告訴容器實際上服務於/test的資源。由於沒有這樣的資源,你會得到一個404.

+0

所以這裏唯一的目的或過濾器是修改請求/迴應之前,實際資源服務? – MadJlzz

+0

不可以。您可以在調用chain.doFilter()之後執行*。 –

+0

是的,然後我的迴應得到承諾,我不能做像'sendRedirect()'的東西。我想我別無選擇,只能做一個包裝來管理我想要的東西。 – MadJlzz

相關問題