web.xml-Java Servlet过滤器-在处理JSP页面之前不运行(在Tomcat上)
我对Servlet过滤器相当陌生,基本上加入了一个使用它们的项目,并在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
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模式上调用。