2009-11-12 73 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); 
} 
相关问题