2012-07-25 51 views
1

我开始学习struts 2.我有3个页面,FirstLevel.jsp,SecondLevel.jsp,BadGuess.jsp。我想在三个页面中应用过滤器。过滤url-pattern/*没有映射到所有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(/ *)。回复非常感谢。

编辑:

我觉得过滤器并不适用于JSP的通过struts.xml中映射?因为当我尝试直接运行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> 

有什么想法?

+0

您不应该直接在MVC应用程序中访问JSP。那些是你的观点,而不是你的控制者。 – 2012-07-25 14:26:57

+0

“直接访问JSP”是什么意思?对不起,我只是一个支柱2新手。 – Jemp 2012-07-26 01:00:04

+1

浏览器中的URL不应以.jsp结尾。这意味着您直接调用JSP并绕过Struts2框架。根据你的问题,这听起来像你这样做。 – 2012-07-26 13:41:42

回答

3

对于过滤器上通过转发达到的JSP运行(默认的结果类型),你需要确保该过滤器正在运行以进行转发请求:

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

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

尝试

<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> 

当支柱过滤停止链无论出于何种原因您的级别过滤器将不会被应用。

0

可能是你的问题涉及到使用弃用过滤调度员:

的FilterDispatcher(org.apache.struts2.dispatcher.FilterDispatcher)在早期的发展Struts2的使用,并且从Struts 2.1它弃用0.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> 
+0

虽然这不应该影响容器如何执行过滤器。 – 2012-07-25 15:06:20

+0

试过了,发生同样的事情。 – Jemp 2012-07-26 00:56:41