1

ストラット 2 を学び始めています。FirstLevel.jsp、SecondLevel.jsp、BadGuess.jsp の 3 つのページがあります。3ページにフィルターをかけたい。

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>

3 つの 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>

何かご意見は?

4

3 に答える 3

3

転送(デフォルトの結果タイプ)を介して到達したJSPでフィルターを実行するには、転送された要求に対してフィルターが実行されていることを確認する必要があります。

<filter-mapping>
  <filter-name>theFilter</filter-name>
  <url-pattern>/the/pattern</url-pattern>
  <dispatcher>REQUEST</dispatcher> 
  <dispatcher>FORWARD</dispatcher>
</filter-mapping>
于 2012-07-25T15:08:51.667 に答える
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>

ストラットフィルターが何らかの理由でチェーンを停止した場合、レベルフィルターは適用されません。

于 2012-07-25T10:53:34.020 に答える
0

問題は、非推奨のフィルター ディスパッチャーの使用に関連している可能性があります。

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>
于 2012-07-25T13:33:49.797 に答える