[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 メーリングリストの案内