[Seasar-user:21441] Re: [SAStruts] トランザクショントークンについての質問

太田浩一 [E-MAIL ADDRESS DELETED]
2012年 8月 31日 (金) 17:30:43 JST


太田といいます。

> これについて、それぞれのActionから別のキーを指定してSessionに保存してトーク
> ンチェックを行う方法は無いでしょうか。

固定のキーでトークンをHTMLに出力しているため、
トークンのキーを変更するにはS2FormTagを更に拡張する必要がありそうです。

参照:
org.apache.struts.taglib.html.FormTag#renderToken()


事例があっているか分かりませんが、
業務ごとにウィンドウを立ち上げて動作する仕様のアプリを作成する際、
トークンの生成のみにTokenProcessorを使用して、
検証処理はForm毎に独自に実装していました。

↓のようなユーティリティメソッド群を整備しました。
 (コメントは割愛しています)
	public static String getToken(String tokenKey) {
		HttpServletRequest request = RequestUtil.getRequest();
		String token = TokenProcessor.getInstance().generateToken(request);
		request.getSession().setAttribute(tokenKey, token);
		return token;
	}
	public static boolean isTokenValid(String tokenKey, String token) {
		HttpServletRequest request = RequestUtil.getRequest();
		String sessionToken = (String) request.getSession().getAttribute(tokenKey);
		if (sessionToken != null && StringUtil.equals(sessionToken, token)) {
			return true;
		}
		return false;
	}
	public static void resetToken(String tokenKey) {
		HttpServletRequest request = RequestUtil.getRequest();
		request.getSession().removeAttribute(tokenKey);
	}


以上、参考になりましたら幸いです。


> こんにちは。
>
> トランザクショントークンについて質問です。
>
> 現在、SAStrutsにて複数の登録フォームが同時に運用されるアプリケーションを開発
> しております。
> ActionFormのスコープをセッションにして、パラメータを受け渡しております。
>
> その際にセッションフィクセーション対策、二重送信対策として、TokenProcessorの
> トランザクショントークンを使用して対策としております。
> この場合、Sessionのキーが
>
> "org.apache.struts.action.TOKEN"
>
> となると思いますが、先述の通り複数のフォームが同時に走るため、同一ブラウザで
> 複数のフォームを立ち上げて並行して登録を進めた場合に、
> トークンのSession値が上書きされてしまい、片方がエラー扱いになってしまいます。
>
> これについて、それぞれのActionから別のキーを指定してSessionに保存してトーク
> ンチェックを行う方法は無いでしょうか。
>
> ユニークなキーの指定が不可能な場合、代替として考えられる機能はあるでしょうか。
>
> いずれも無理な場合は、登録フォームごとに独自のワンタイムトークンの処理を実装
> する他ないのでしょうか。
>
> お分かりでしたら、お教えいただけると助かります。
>
> よろしくお願いいたします。
> _______________________________________________
> Seasar-user mailing list
> Seasar-user @ ml.seasar.org
> https://ml.seasar.org/mailman/listinfo/seasar-user
>



Seasar-user メーリングリストの案内