2

Struts アプリケーションで作成された多くのクラスがあります。どのクラスでもログイン状態かどうかは確認していません。代わりに、基本アクション クラスを拡張しました。

ここで、基本アクションでプリハンドラーを作成して、ログインを確認し、ログインしていない場合はリダイレクトしたいと考えています。

私はこのようなものが欲しい:

public BaseAction(){
  if(isLoggedIn){
    //go to child which was called
   }
   else {   //redirect to login page
  }          
}

もう 1 つの方法はisLoggedIn()、すべてのアクション クラスでこのメソッドを呼び出し、グローバルな結果を次のように定義して確認することです。

<result name="not-logged-in" type="redirectAction">Login.action</result>

このためのより良い方法を見つけるのを手伝ってください。

4

2 に答える 2

3

基本アクション クラスのコンストラクターをチェックインしたいようですが、間違っています。コンストラクターは、アクション インスタンスをインスタンス化するためにオブジェクト ファクトリによって使用されます。この段階では、いくつかのことが利用可能です。あなたの場合、それは間違っています。もう 1 つのアプローチは、メソッド呼び出しが機能する前にロジックをメソッド say execute()and callに移動するsuper.execute()ことですが、スーパー呼び出しをアクションに入れるのを忘れると、アクション コードが認証されずに実行される可能性があります。これを防ぐには、アクションが実行される前にコードを実行し、アクション インスタンスまたはアクション コンテキストにアクセスして、より Struts2 になるようにする必要があります。Struts 2 in Actionという本を読んだことがないと思うので、私自身の考えをいくつか述べます。それは、作成AuthenticationInterceptorと実装するアクションについてですUserAwareログインしたユーザーを、このインターフェースを実装するアクションに挿入します。インターセプターは次のようになります

public class AuthenticationInterceptor implements Interceptor {

public void destroy() {
}

public void init() {
}

public String intercept(ActionInvocation actionInvocation) throws Exception {
    Map session = actionInvocation.getInvocationContext().getSession();
    User user = (User) session.get(Struts2MyConstants.USER);
            
    if (user == null) {
        return Action.LOGIN; //login required result
    }               
    else {              
        Action action = (Action)actionInvocation.getAction();
        
        if (action instanceof UserAware) {
            User freshUser = myService.getUser(user.getId());
            ((UserAware)action).setUser(freshUser);
        }
        
        System.out.println("Logged in: interceptor");
        return actionInvocation.invoke();
    }
}

UserAwareように見えます

public interface UserAware {
    
    public void setUser( User user );
    
}

任意のアクションを参照する安全なデフォルト スタックを作成します

<interceptors>
  <interceptor name="authenticationInterceptor" class="org.yourapp.struts.interceptor.AuthenticationInterceptor"/>
  <interceptor-stack name="secureStack">
    <interceptor-ref name="authenticationInterceptor"/>
    <interceptor-ref name="defaultStack"/>
  </interceptor-stack>
</interceptors>
<default-interceptor-ref name="secureStack"/> 

ベースアクションを実装するUserAware場合、ログインしているユーザーオブジェクトは、セッションからだけでなく、ユーザーのゲッターを定義するか保護すると、アクションでも利用できます。Userセキュリティ機能を損なわないように、オブジェクトを不変にする必要があります。

于 2013-04-27T19:26:22.017 に答える
2

を使用できますFilter。すべてのクラスにBaseAction.

編集

このフィルターを web.xml ファイルにマップして、Struts コントローラー サーブレットの前に実行されるようにします。

<filter>
   <filter-name>AuthorizationFilter</filter-name>
   <filter-class>my.company.AuthorizationFilter</filter-class>
</filter>

<filter-mappging>
    <filter-name>AuthorizationFilter</filter-name>
    <servlet-name>StrutsActionServlet</servlet-name>
</filter-mapping>

または URL パターンによって:

<filter-mapping>
    <filter-name>AuthorizationFilter</filter-name>
    <url-pattern>*.do</url-pattern>
</filter-mapping>

編集

質問を変更しましたが、結局使用しているのはstruts 2のようです。その場合、フィルターの代わりにインターセプターを作成できます。基本的には同じことを行いますが、インターセプターは残りの Struts 構成と一緒に構成できます。

于 2013-04-27T17:27:13.053 に答える