2009-11-12 63 views
1

我是Servlet過濾器的新手,基本上已加入使用它們的項目,並在web.xml文件中添加了一個額外的過濾器Tomcat 5.5)。web.xml - Java Servlet過濾器 - 在處理JSP頁面之前未運行(在Tomcat上)

我95%確定它在某些時候工作正常,但現在在調試時如果我在JSP頁面的頂部放置斷點,我試圖查看(login.jsp),它是模板頁面(page.jsp)配置的過濾器的方法doFilter();它貫穿整個login.jsp頁面(從上到下),然後page.jsp並開始處理過濾器。

我需要它先運行過濾器,因爲它們中的一個決定了頁面應該顯示的語言(檢查cookie,db設置和瀏覽器設置),然後應該應用於login.jsp

有沒有人有什麼建議可能會出錯?

有很多我可以發佈的代碼,但我不相信這將是任何使用,因爲它都是在錯誤的順序工作。從web.xml中

摘錄:

<web-app> 
... 
<filter> 
     <filter-name>SetSecurityContextFilter</filter-name> 
     <filter-class> 
      com.section2.SecurityContextServletFilter 
     </filter-class> 
    </filter> 

<filter> 
    <filter-name>SetLocaleFilter</filter-name> 
    <filter-class> 
     com.section2.locale.LocaleServletFilter 
    </filter-class> 
</filter> 

<filter> 
    <filter-name>trinidad</filter-name> 
    <filter-class>org.apache.myfaces.trinidad.webapp.TrinidadFilter</filter-class> 
</filter> 

<filter> 
    <filter-name>ActiveUserFilter</filter-name> 
    <filter-class>com.section2.ActiveUserFilter</filter-class> 
</filter> 

    <filter-mapping> 
     <filter-name>trinidad</filter-name> 
     <servlet-name>Faces Servlet</servlet-name> 
    </filter-mapping> 

    <filter-mapping> 
     <filter-name>SetSecurityContextFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

    <filter-mapping> 
     <filter-name>SetLocaleFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

    <filter-mapping> 
     <filter-name>ActiveUserFilter</filter-name> 
     <url-pattern>/pages/section2/user/*</url-pattern> 
    </filter-mapping> 

... 
</web-app> 

在此先感謝。

+0

您在http://java.sun.com/products/servlet/Filters.html了外觀和http://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/Filter.html?不知道你在做什麼,很難想象出了什麼問題。你有沒有嘗試像碼頭一樣的另一個servlet容器? – 2009-11-12 08:16:52

回答

1

感謝您的答覆 - 我現在已經完全理解了這個問題......它只發生在login.jsp頁面,沒有其他頁面。在我的情況下,login .jsp頁面是一個特例,因爲它通常被視爲重定向的結果。

web.xml

<login-config> 
     <auth-method>FORM</auth-method> 
     <form-login-config> 
      <form-login-page>/login.jsp</form-login-page> 
      <form-error-page>/login.jsp?error=true</form-error-page> 
     </form-login-config> 
    </login-config> 

而且我相信正因爲如此,過濾器都打在通常的順序!添加了來自登錄頁面的呼叫,以完成過濾器的功能,並且一切正常。

再次感謝。

0

一個明顯的錯誤是在特立尼達濾波器映射。它不應該有一個servlet名稱,而是一個url模式。

+0

這是完全有效的。它只意味着特定的過濾器與相關的servlet耦合,因此只能在相同的url模式下調用。 – BalusC 2009-11-12 11:21:19

7

Filter代碼是如何組織的?你是否可能先打電話FilterChain#doFilter(),然後才做需要的邏輯?

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { 
    // Any code here will be executed BEFORE passing request through JSP/Servlet. 
    chain.doFilter(request, response); 
    // Any code here will be executed AFTER passing request through JSP/Servlet. 
} 
0

沒有爲login.jsp調用過濾器的原因是,Tomcat對規範的解釋是認證是容器的一部分,而不是Web應用程序的一部分,所以發生在過濾器角色之外。因此,過濾器不會應用於登錄頁面(本例中爲login.jsp)或j_security_check。

ref:https://issues.apache.org/bugzilla/show_bug.cgi?id=21795 - 標題只引用j_security_check,但討論涵蓋了整個基於表單的認證機制。

0

我有同樣的問題時,我說:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { 
    if(...) { 
     response.sendRedirect(url); 
    } 
    chain.doFilter(request, response); 
} 

代替

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { 
    if(...) { 
     response.sendRedirect(url); 
     return; 
    } 
    chain.doFilter(request, response); 
} 
相關問題