2012-07-25 57 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