【概要】インターセプターを利用して、Actionが呼び出される度にインターセプターによるセッションチェックを行う。
../dto/LoginDto.java の作成
まずログイン情報をセッションに保存するための器「LoginDto」を用意する。
(当初LoginInfoという名前で作成したのだがうまくいかず。「Dto」というサフィックスが重要らしい)
@Component(instance = InstanceType.SESSION)
(当初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 {
@Override
customizer.dicon
}
・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の場合タイムアウトと見なす。
// loginDtoがNULLだったり、NULLでなくてもコードがNULLの場合タイムアウトと見なす。
if (loginDto == null || loginDto.userCode == null) {
// タイムアウト画面
return "/index.jsp";
}
return "/index.jsp";
}
Object result = null;
try {
result = invocation.proceed();
} catch (Exception e) {
// エラー時の処理
}
}
return result;
}
}
customizer.dicon
customizer.diconファイルを編集する。
<component name="actionCustomizer"...のタグの中に以下を追加する。
①と②で、セッションチェックを実行しないアクションを指定する。
IndexActionではまだログインしていないので、チェック対象から除外する。
①は除外対象のパッケージを前方一致で指定。
②は除外対象のアクションクラス名を指定。(カンマ区切りで複数指定可)
appdicon.dicon に以下を追加
IndexAction.java
ログイン処理を実装する。
・
・ログイン認証処理
・
<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"/>
ログイン処理を実装する。
public class IndexAction extends AbstractAction {
@Resource
public LoginDto loginDto;
・
@Resource
@ActionForm
protected IndexForm indexForm;・
・
・
@Execute(validator=true, input="index.jsp")
・
@Execute(validator=true, input="index.jsp")
public String login() {
・
・ログイン認証処理
・
// 認証できたら、loginDtoにユーザー情報を設定
loginDto.userCode = indexForm.userCode;
// トップ画面へ
return "Top.jsp";
return "Top.jsp";
}
【参考文献】
Seasar 2 徹底入門 SAStruts/S2JDBC 対応/翔泳社