1

我对 Servlet 过滤器相当陌生,基本上已经加入了一个使用它们的项目,并在web.xml文件中添加了一个额外的过滤器(部署在Tomcat 5.5上)。

我有 95% 的把握在某些时候它工作正常,但现在在调试时,如果我将断点放在我试图查看的 JSP 页面的顶部(login.jsp),它是模板页面(page.jsp),并且在两个配置的过滤器doFilter()方法中;它贯穿整个login.jsp页面(从上到下),然后page.jsp开始处理过滤器。

我需要它首先运行过滤器,因为其中一个决定了页面应该显示的语言(检查 cookie、数据库设置和浏览器设置),然后应该应用于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>

提前致谢。

4

5 回答 5

8

代码是如何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.
}
于 2009-11-12T11:28:07.660 回答
2

感谢您的回复 - 我现在已经完全理解了这个问题......它只发生在 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>

我认为因此,过滤器没有按通常的顺序命中!从登录页面添加了一个调用来执行过滤器所做的事情,一切都很好。

再次感谢。

于 2009-11-12T13:14:37.863 回答
1

login.jsp 没有调用过滤器的原因是 Tomcat 对规范的解释是身份验证是容器的一部分,而不是 webapp 的一部分,因此发生在过滤器的角色之外。因此过滤器不适用于登录页面(在本例中为 login.jsp)或 j_security_check。

参考:https ://issues.apache.org/bugzilla/show_bug.cgi?id= 21795 - 标题仅引用 j_security_check,但讨论涵盖了整个基于表单的身份验证机制。

于 2013-12-17T13:12:43.137 回答
0

一个明显的错误是在特立尼达过滤器映射中。它不应该有一个 servlet 名称,而是一个 url 模式。

于 2009-11-12T09:47:44.053 回答
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);
}
于 2017-08-10T21:43:54.350 回答