3

Struts 2 を使用して、次のインターセプターを使用しています。

public class AccessInterceptor extends AbstractInterceptor {
    @Override
    public String intercept(ActionInvocation ai) throws Exception {
        ActionContext actionContext = ai.getInvocationContext();
        Map<String, Object> session = actionContext.getSession();
        Boolean logged = (Boolean) session.get("logged");
        if(logged == null) {
          session.put("logged", false);
          logged = false;
        }
        if (!logged) {
            // If exception is here, it IS thrown, so I am sure "login" is returned on /homepage
            return "login";
        }   
        return ai.invoke();
    }
}

そしてこれ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="loginInterceptor" namespace="/" extends="struts-default">
    <interceptors> 
        <interceptor name="access"
         class="logininterceptor.interceptors.AccessInterceptor"/>
        <interceptor-stack name="appDefault"> 
            <interceptor-ref name="access" />
            <interceptor-ref name="defaultStack" /> 
        </interceptor-stack> 
    </interceptors> 
    <default-interceptor-ref name="appDefault" />       
    <global-results>
        <result name="login">/WEB-INF/content/login.jsp</result>
    </global-results>
</package>
</struts>

私は/WEB-INF/content/homepage.jspJSP/WEB-INF/content/login.jspmypackage.LoginAction.javaクラスも持っています。ホームページ用のアクションクラスはありません

問題は、/homepageページに移動してもリダイレクトされlogin.jspず、homepage.jspコンテンツが表示されることです。なにが問題ですか?

PS: struts2-convention-plugin を使用しています

4

2 に答える 2

2

これは、コンベンション プラグインがインターセプターまたはインターセプター スタックを認識しない「convention-default」パッケージを使用するために発生します。

インターセプター スタックが行うこと (インターセプター、インターセプター スタックを定義し、既定の結果の型を定義する) を実行する Conventions-default を拡張するパッケージを作成し、規約プラグインがそのスタックをすべてのアクションの既定値として適用するようにすることができれば、それは素晴らしいですか?あなたはできる。

タグの後に次の<struts>ように定数を定義します。

<constant name="struts.convention.default.parent.package" value="loginInterceptor"/>

もう 1 つの提案は、struts.xml を使用して規則をオーバーライドすることでした。これは問題ありませんが、少し冗長です。

別のオプションは、親パッケージの注釈を使用することです。これは、デフォルトの動作をオーバーライドする必要がある場合に適していますが、指摘したように、これをデフォルトの動作にしたいので、実装するのではなく、これをオーバーライドするために注釈を予約する必要があります。

将来のために、次の struts2 規則プラグイン定数のリストを閲覧する価値があるかもしれません: http://struts.apache.org/2.1.8/docs/convention-plugin.html#ConventionPlugin-Overwritingpluginclasses

PS: 好みに名前を付けるだけですが、あなたのパッケージは loginInterceptor ではなく login-package と呼びます...大したことではありません。

于 2012-10-02T23:37:51.520 に答える
0

誰かが にアクセスするたびにインターセプターを強制的に実行したい場合homepage.jsp、これを行う正しい方法は、jsp を返すアクションを配置することです。例えば:

<struts>
...
<package name="loginInterceptor" namespace="/" extends="struts-default">
    <interceptors> 
        ...
    </interceptors> 
    <default-interceptor-ref name="appDefault" />       
    <global-results>
       ...
    </global-results>
    <action name="homepage">
        <result>/WEB-INF/content/homepage.jsp</result>
    </action>
</package>
</struts>

その後、ユーザーが にアクセスしようとするとhttp://.../homepage.action、インターセプターが実行され、ユーザーがログインしていない場合はログイン ページにリダイレクトされます。

于 2012-09-28T22:59:26.113 に答える