web.xml中 - Java Servlet的过滤器 - 不被处理的JSP页面(在Tomcat)前运行
-
19-09-2019 - |
题
我是相当新的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);
}