web.xml-Java Servlet过滤器-在处理JSP页面之前不运行(在Tomcat上)

web.xml-Java Servlet过滤器-在处理JSP页面之前不运行(在Tomcat上),java,jsp,tomcat,web.xml,servlet-filters,Java,Jsp,Tomcat,Web.xml,Servlet Filters,我对Servlet过滤器相当陌生,基本上加入了一个使用它们的项目,并在web.xml文件(部署在Tomcat5.5上)中添加了一个额外的过滤器 我95%确信它在某个时候工作正常,但现在在调试时,如果我将断点放在我试图查看的JSP页面的顶部(login.JSP),它是模板页面(page.JSP),并且在配置的过滤器的doFilter()方法中;它运行整个login.jsp页面(从上到下),然后page.jsp并开始处理过滤器 我需要它首先运行过滤器,因为其中一个过滤器决定页面应该显示的语言(检查c

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

我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>

...
SetSecurityContextFilter
com.section2.SecurityContextServletFilter
SetLocaleFilter
com.section2.locale.LocaleServletFilter
特立尼达
org.apache.myfaces.trinidad.webapp.TrinidadFilter
ActiveUserFilter
com.section2.ActiveUserFilter
特立尼达
Facesservlet
SetSecurityContextFilter
/*
SetLocaleFilter
/*
ActiveUserFilter
/第页/第2节/用户/*
...

提前感谢。

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

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

过滤器是如何组织的?您是否可能先调用
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.
}

过滤器
代码是如何组织的?您是否可能先调用
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页面,其他页面都没有。在我的例子中,
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>

形式
/login.jsp
/login.jsp?error=true
我想正因为如此,过滤器并没有按照通常的顺序被击中!从登录页面添加了一个调用,以完成过滤器的功能,一切正常


再次感谢。

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

形式
/login.jsp
/login.jsp?error=true
我想正因为如此,过滤器并没有按照通常的顺序被击中!从登录页面添加了一个调用,以完成过滤器的功能,一切正常


再次感谢。

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


ref:-标题仅引用j_security_check,但讨论涵盖了整个基于表单的身份验证机制。

没有为login.jsp调用筛选器的原因是Tomcat对规范的解释是身份验证是容器的一部分,而不是webapp的一部分,在过滤器的作用之外也会发生这种情况。因此,过滤器不会应用于登录页面(本例中为login.jsp)或j_安全检查


ref:-标题仅提及j_security_check,但讨论涵盖了整个基于表单的身份验证机制。

我在写作时遇到了同样的问题:

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);
}

我在写作时也遇到了同样的问题:

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);
}

你看过了吗?不知道自己在做什么,很难想象出哪里出了问题。您是否尝试过另一个servlet容器,如jetty?您已经看过和了吗?不知道自己在做什么,很难想象出哪里出了问题。您是否尝试过其他servlet容器,如jetty?它完全有效。这只意味着特定的过滤器与所讨论的servlet耦合,因此只能在相同的url模式上调用。这是完全有效的。这只意味着特定过滤器与所讨论的servlet耦合,因此只能在相同的url模式上调用。