Java: Struts2: SessionToken 二重送信防止機能

Struts2 には二重送信防止機能も付いている。
トークンを発行してセッションに保存した後、一度だけそのトークンでのActionの実行を許可する。という内容。

tokenとtokenSessionの二つがあって、tokenSessionの方は、二重送信後にも一度目の送信結果画面を表示してくれる。
今のところ、tokenSessionしか使っていないので、そっちの設定例を。

struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
  <constant name="struts.objectFactory" value="spring" />
  <constant name="struts.devMode" value="false" />

  <package name="mypackage" extends="struts-default">
    <interceptors>
      <interceptor-stack name="myStack">
        <interceptor-ref name="tokenSession">
          <param name="includeMethods">add</param>
        </interceptor-ref>
        <interceptor-ref name="defaultStack" />
      </interceptor-stack>
    </interceptors>
    <default-interceptor-ref name="myStack" />
    <action name="act" class="Action">
      <result name="invalid.token" type="redirectAction">/hoge</result>
    </action>
  </package>
</struts>

JSP側

<s:form action="user_add">
 <s:token/>
   :
</s:form>

Action単位でも設定できるので、詳しくはこちらを。
TokenInterceptorの使い方
Token Session Store Interceptorの使い方

Java: Struts2: interceptor excludeMethods

Struts2 の interceptor で下記のように書くとそのメソッドだけ除外できるっぽい。
これないかなーないかなーって探していて、諦めていたんだけれど、ひょんなところで見つけた・・・w

<interceptor-ref name="authSession">
  <param name="excludeMethods">Login</param>
</interceptor-ref>

Struts2: Java: interceptor でハマったよ

Struts2 でアプリを作っていて、Interceptor を使おうとしたら、めちゃはまった・・・

public class AuthenticationInterceptor extends AbstractInterceptor {

	private static final long serialVersionUID = 1L;

	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		Map<String, Object> session = ActionContext.getContext().getSession();
		Boolean auth = (Boolean)session.get(AuthenticationAction.AUTH_KEY);
		if (null == auth || !auth.booleanValue()) {
			return "auth-error";
		} else {
			// 次のインターセプター処理
			return invocation.invoke();
		}
	}

}

というのが正解のソースコード。

じゃあ、何がダメなやつはどこがおかしかったのかと言うと
この Interceptor 独自の戻り値を struts.xml で定義した、global-results の値にマッチングさせたい時
次のインターセプター処理を呼び出してはいけない!!
って事ですな・・・

インターセプターが戻り値を持っている時点でもっと早く気がつけよ。って気がしないでもないです。はい。

ちなみに、 struts.xml はこんな感じ。




  
  

    
      
      
        
        
      
    
    
    
    
      auth/login
    
    
      /WEB-INF/pages/admin/index.jsp
      auth/login
    
  

    
      admin/index
      /WEB-INF/pages/auth/login.jsp