[Seasar-user:3401] Re: ログインアプリケーション
Junichi Kato
[E-MAIL ADDRESS DELETED]
2006年 3月 20日 (月) 17:48:48 JST
加藤@S2初心者です。
うーん、あまり美しなくないですが、
以下のように実装して、目的のことができるようになりました。
もっと、スマートな実装方法があれば、教えてくださいませ>みなさま
HttpServletRequestの取得は、結局 S2Containerから取得しました。
認証後に戻るページについては、outcome名を、セッターインジェクションで、以下のように設定するようにしました。
<component name="configAction" class="jp.grandtech.caribbean.action.impl.ConfigActionImpl" instance="request">
<aspect>
<component class="jp.grandtech.caribbean.aop.LoginInterceptor">
<property name="nextPage">"config"</property>
</component>
</aspect>
</component>
public class LoginInterceptor implements MethodInterceptor {
private S2Container container;
private String nextPage;
public void setS2Container(S2Container container){
this.container = container;
}
private HttpServletRequest getRequestFromContainer() {
HttpServletRequest request = (HttpServletRequest)container.getComponent(HttpServletRequest.class);
return request;
}
// セッターインジェクションで認証後に復帰する画面のoutcomeを受け取る
public void setNextPage(String nextPage){
this.nextPage = nextPage;
}
public Object invoke(MethodInvocation invocation) throws Throwable {
HttpServletRequest request = getRequestFromContainer();
HttpSession session = request.getSession(false);
if ( session.getAttribute("loginInfo") != null ){
return invocation.proceed();
}
// 認証後に復帰する画面のoutcomeをセッションに保存する。
session.setAttribute("nextPage", this.nextPage);
// ログイン画面に繊維する。
return "login";
}
}
public class LoginActionImpl implements LoginAction {
private HttpSession session;
public void setSession(HttpSession session) {
this.session = session;
}
// セッション上のnextPageを受け取る。
private String nextPage;
public void setNextPage(String nextPage) {
this.nextPage = nextPage;
}
/*ログイン画面のログインボタンに対するアクション*/
public String login() {
if ( /* ユーザを認証 */ ){
// loginInfo書き込む
this.session.setAttribute("loginInfo", /* ログイン情報を書き込む */);
return this.nextPage;
}
return null;
}
}
Seasar-user メーリングリストの案内