Seasar2でページごとにログイン情報を自動的にチェックする | おうじ様の開発メモ

おうじ様の開発メモ

おうじ様がシステム開発過程において習得した技術に関する開発メモ

Seasar2でページが切り替わる度に、毎回自動的にログイン情報をチェックした場合の、おうじ様の開発メモ

【概要】インターセプターを利用して、Actionが呼び出される度にインターセプターによるセッションチェックを行う。

../dto/LoginDto.java の作成
まずログイン情報をセッションに保存するための器「LoginDto」を用意する。
(当初LoginInfoという名前で作成したのだがうまくいかず。「Dto」というサフィックスが重要らしい)

@Component(instance = InstanceType.SESSION)
public class LoginDto implements Serializable {
private static final long serialVersionUID = 1L;

/* ユーザーコード */
public String userCode;
/* ユーザー名 */
public String userName;
}

Componentアノテーションで、instance に、 「InstanceType.SESSION」を指定する。
・Serializableインターフェースを実装する。

・名前は~Dtoにして、dtoパッケージに置く。

インターセプター
監視クラスSessionInterceptorを作成する。

public class SessionInterceptor extends AbstractInterceptor {
private static final long serialVersionUID = 1L;

@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
Map<String, Object> sessionScope = SingletonS2Container.getComponent("sessionScope");
LoginDto loginDto = (LoginDto) sessionScope.get("loginDto");
        // loginDtoがNULLだったり、NULLでなくてもコードがNULLの場合タイムアウトと見なす。
if (loginDto == null || loginDto.userCode == null) {
            // タイムアウト画面
return "/index.jsp";
        }

Object result = null;
try {
result = invocation.proceed();
} catch (Exception e) {
            // エラー時の処理
}
return result;
}
}

customizer.dicon
customizer.diconファイルを編集する。
<component name="actionCustomizer"...のタグの中に以下を追加する。

    <initMethod name="addCustomizer">
      <arg>
        <component class="org.seasar.framework.container.customizer.AspectCustomizer">
          <property name="interceptorName">"sessionInterceptor"</property>
          <initMethod name="addIgnoreClassPattern">
            ①<arg>"~.action"</arg>
            ②<arg>"IndexAction"</arg>
          </initMethod>
        </component>
      </arg>
    </initMethod>

①と②で、セッションチェックを実行しないアクションを指定する。
IndexActionではまだログインしていないので、チェック対象から除外する。
①は除外対象のパッケージを前方一致で指定。
は除外対象のアクションクラス名を指定。(カンマ区切りで複数指定可)

appdicon.dicon に以下を追加
<component name="sessionInterceptor" class="~.SessionInterceptor"/>

IndexAction.java 
ログイン処理を実装する。

public class IndexAction extends AbstractAction {
@Resource
public LoginDto loginDto;
@Resource
@ActionForm
protected IndexForm indexForm;



    @Execute(validator=true, input="index.jsp")
public String login() {
   
    ・
    ・ログイン認証処理
    ・

     // 認証できたら、loginDtoにユーザー情報を設定
loginDto.userCode = indexForm.userCode;
    
        // トップ画面へ
     return "Top.jsp";

    }




【参考文献】
Seasar 2 徹底入門 SAStruts/S2JDBC 対応/翔泳社
¥3,990
Amazon.co.jp