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

时间:2009-11-12 08:08:18

标签: java jsp tomcat web.xml servlet-filters

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

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

我首先需要它来运行过滤器,因为其中一个确定了页面应该显示的语言(检查cookie,数据库设置和浏览器设置),然后应该应用于page.jsp

有没有人对可能出现的问题有任何建议?

我可以发布很多代码,但我不相信它会有任何用处,因为它的工作顺序错误。

来自web.xml的片段:

login.jsp

提前致谢。

5 个答案:

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