我是Servlet过滤器的新手,基本上已经使用它们加入了一个项目,并为web.xml
文件添加了一个额外的过滤器(部署在 Tomcat 5.5 上)。
我95%肯定在某些时候它正常工作但现在在调试时如果我将断点放在JSP页面的顶部我试图查看(login.jsp
),它是模板页面({{ 1}})并且在两个配置的过滤器的page.jsp
方法中;它贯穿整个doFilter()
页面(从上到下),然后login.jsp
,并开始处理过滤器。
我首先需要它来运行过滤器,因为其中一个确定了页面应该显示的语言(检查cookie,数据库设置和浏览器设置),然后应该应用于page.jsp
。
有没有人对可能出现的问题有任何建议?
我可以发布很多代码,但我不相信它会有任何用处,因为它的工作顺序错误。
来自web.xml的片段:
login.jsp
提前致谢。
答案 0 :(得分: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.
}
答案 1 :(得分:1)
感谢您的回复 - 我现在完全理解了这个问题......它只发生在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>
我认为因此,过滤器没有按照通常的顺序命中!添加了一个来自登录页面的调用,以执行过滤器的操作并且一切正常。
再次感谢。
答案 2 :(得分:1)
没有为login.jsp调用过滤器的原因是Tomcat对规范的解释是认证是容器的一部分,而不是webapp的一部分,因此发生在过滤器的角色之外。因此,过滤器不会应用于登录页面(在本例中为login.jsp)或j_security_check。
ref:https://issues.apache.org/bugzilla/show_bug.cgi?id=21795 - 标题仅引用j_security_check,但讨论涵盖了整个基于表单的身份验证机制。
答案 3 :(得分:0)
一个明显的错误是在trinidad过滤器映射中。它不应该有servlet-name,而应该是url-pattern。
答案 4 :(得分:0)
我写的时候遇到了同样的问题:
#Compose URL
#Create a New-Object system.Data.DataTable and configure it
#Make Invoke-RestMethod API call to get the collection of objects
Foreach($object in $Collection){
#Make API call for details about each object
#Add data to datatable
}
#Write datatable to database
代替
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
if(...) {
response.sendRedirect(url);
}
chain.doFilter(request, response);
}