带有 url-pattern /* 的过滤器未映射到所有 jsp

Posted

技术标签:

【中文标题】带有 url-pattern /* 的过滤器未映射到所有 jsp【英文标题】:Filter with url-pattern /* not mapped to all jsp's 【发布时间】:2012-07-23 17:38:12 【问题描述】:

我开始学习struts 2。我有3页,FirstLevel.jsp,SecondLevel.jsp,BadGuess.jsp。我想在三个页面中应用过滤器。

LevelFilter.java

package com.tutorialspoint.struts2;

import java.io.IOException;
import javax.servlet.*;

public class LevelFilter implements Filter

    @Override
    public void destroy() 
        System.out.println("desroy");
    

    @Override
    public void doFilter(ServletRequest req, ServletResponse res,
            FilterChain chain) throws IOException, ServletException 
        // TODO Auto-generated method stub
        System.out.println("level filter");
        chain.doFilter(req, res);
    

    @Override
    public void init(FilterConfig arg0) throws ServletException 
        // TODO Auto-generated method stub
        System.out.println("init here");
    


web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns="http://java.sun.com/xml/ns/javaee" 
   xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
   http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
   id="WebApp_ID" version="3.0">

   <display-name>Struts 2</display-name>
   <welcome-file-list>
      <welcome-file>FirstLevel.jsp</welcome-file>
   </welcome-file-list>

   <filter>
      <filter-name>struts2</filter-name>
      <filter-class>
         org.apache.struts2.dispatcher.FilterDispatcher
      </filter-class>
   </filter>
   <filter>
      <filter-name>Level Filter</filter-name>     
        <filter-class>
            com.tutorialspoint.struts2.LevelFilter
        </filter-class>
   </filter>
   <filter>
      <filter-name>Authentication Filter</filter-name>     
        <filter-class>
            com.tutorialspoint.struts2.AuthenticationFilter
        </filter-class>
   </filter>

   <filter-mapping>
      <filter-name>struts2</filter-name>
      <url-pattern>/*</url-pattern>
   </filter-mapping>
   <filter-mapping>
      <filter-name>Level Filter</filter-name>     
      <url-pattern>/*</url-pattern> 
   </filter-mapping>
    <filter-mapping>
      <filter-name>Authentication Filter</filter-name>     
      <url-pattern>/*</url-pattern> 
   </filter-mapping>





</web-app>

这三个jsp只是由输入的东西组成。当我运行 FirstLevel.jsp 时,控制台中的消息(“LevelFilter”)会堆积,但是当我提交表单时(如果正确,表单将提交给 Secondlevel.jsp,否则提交给 BadGuess.jsp)控制台不会产生信息。它还应该在控制台中生成一条消息,因为我将过滤器映射到所有 jsps (/*)。非常感谢您的回复。

编辑:

我认为过滤器不适用于struts.xml映射的jsp?因为当我尝试直接运行BadGuess.jsp 时,控制台中的消息显示,这意味着doFilter 已应用于它。

struts.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
   "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
   "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.devMode" value="true" />
   <package name="magicwords" extends="struts-default">
      <action name="firstMagicWord" 
            class="com.tutorialspoint.struts2.LevelAction" 
            method="execute">
            <result name="success">/SecondLevel.jsp</result>
            <result name="error">/BadGuess.jsp</result>
      </action>
   </package>
</struts>

有什么想法吗?

【问题讨论】:

您不应该直接在 MVC 应用程序中访问 JSP。这些是您的视图,而不是您的控制器。 “直接访问 JSP”是什么意思?对不起,我只是一个 struts 2 新手。 浏览器中的 URL 绝不应以 .jsp 结尾。这意味着您正在直接调用 JSP 并绕过 Struts2 框架。根据您的问题,听起来您正在这样做。 感谢您的回复。我会记住这一点。 【参考方案1】:

尝试更改过滤器的顺序...它们按照映射顺序被调用。

试试

  <filter-mapping>
      <filter-name>Authentication Filter</filter-name>     
      <url-pattern>/*</url-pattern> 
   </filter-mapping>
   <filter-mapping>
      <filter-name>Level Filter</filter-name>     
      <url-pattern>/*</url-pattern> 
   </filter-mapping>
   <filter-mapping>
      <filter-name>struts2</filter-name>
      <url-pattern>/*</url-pattern>
   </filter-mapping>

当 struts 过滤器因任何原因停止链时,您的级别过滤器将不会被应用。

【讨论】:

【参考方案2】:

您的问题可能与使用已弃用过滤器调度程序有关:

FilterDispatcher (org.apache.struts2.dispatcher.FilterDispatcher) 用于早期的 Struts2 开发,自 Struts 2.1.3 起已弃用。

如果您使用的 Struts 版本 >= 2.1.3,则始终建议升级新的过滤器类 - StrutsPrepareAndExecuteFilter (org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter)。

代替

<filter>
   <filter-name>struts2</filter-name>
       <filter-class>
           org.apache.struts2.dispatcher.FilterDispatcher
       </filter-class>
</filter>

尝试使用

<filter>
    <filter-name>struts2</filter-name>
        <filter-class>
         org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
        </filter-class>
</filter>

【讨论】:

不过,这不应该影响容器执行过滤器的方式。【参考方案3】:

要在通过转发(默认结果类型)到达的 JSP 上运行过滤器,您需要确保过滤器正在为转发的请求运行:

<filter-mapping>
  <filter-name>theFilter</filter-name>
  <url-pattern>/the/pattern</url-pattern>
  <dispatcher>REQUEST</dispatcher> 
  <dispatcher>FORWARD</dispatcher>
</filter-mapping>

【讨论】:

以上是关于带有 url-pattern /* 的过滤器未映射到所有 jsp的主要内容,如果未能解决你的问题,请参考以下文章

java.lang.IllegalArgumentException:过滤器映射必须指定 <url-pattern> 或 <servlet-name>

奇怪的 Java Servlet 过滤器映射行为

过滤器

关于拦截器与过滤器使用场景拦截器与过滤器的区别整理

排除子目录的过滤器映射 url 模式

[ERROR:]tomcat org.apache.catalina.LifecycleException: Failed to start component ……