我是相当新的Servlet过滤器,并已基本加入使用它们的项目,并增加了一个额外的过滤器的web.xml文件(部署在的的Tomcat 5.5 的)。

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

我需要它首先运行的过滤器,因为它们中的一个确定页应该被显示在(检查饼干,分贝设置和浏览器的设置)的语言然后应适用于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>

预先感谢。

有帮助吗?

解决方案 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>

和我相信正因为如此,该过滤器不会在通常的顺序打!增加了一个从登录页面调用做什么过滤器做,一切都很好。

再次感谢。

其他提示

是如何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.
}

之所以滤波器的未要求的login.jsp是该规范的Tomcat的解释是,认证的容器,而不是web应用的一部分的部分,所以会发生过滤器的作用外。因此过滤器不被施加到登录页面(login.jsp的在这种情况下)或j_security_check。

REF: https://issues.apache.org/bugzilla/show_bug。 CGI ID = 21795个 - ?标题唯一引用j_security_check,但讨论覆盖整个基于表单的认证机制

一个明显的错误是在特立尼达过滤器映射。它不应该有一个servlet-名称,但一个url-图案。

我有同样的问题时写:

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);
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top