Struts 2ブロッキングの使用に注意すべき点

1538 ワード

今日ブロッキングを書いていたらバグのような問題が見つかりました
私が使っているバージョンは2.1です.8
 
ブロックブロックのブロック条件を満たす要求にアクセスすると、コードはすでにブロックに入り、戻り結果もブロック後に変更されたジャンプ結果であるが、戻り結果に従ってジャンプせず、actionに入る.
 
ソースコードは次のとおりです.
public String intercept(ActionInvocation invocation) throws Exception {
	ActionContext ctx = ActionContext.getContext();
	String result = invocation.invoke();
	Map session = ctx.getSession();
	if ("guest".equals(type)) {
		if (null == session.get("guest")) {
			result = Action.LOGIN;
		}
    } else {
    	if (null == session.get("user")) {
			result = Action.LOGIN;
		}
    }
	return result;
}

 
ここで,ユーザsessionが無効になった後も,ジャンプは依然としてactionの指向であり,私のloginの指向ではなく,奇妙な問題である.
検査を繰り返した後、やっと気づいたのはinvocationだった.invoke()がおかしい
このメソッドは、結果を返す前に呼び出される限り、結果が何に変更されてもactionの正常なジャンプに影響を与えず、ブロックジャンプ効果が失効します.
 
最終変更後の有効コードは次のとおりです.
public String intercept(ActionInvocation invocation) throws Exception {
	ActionContext ctx = ActionContext.getContext();
	String result = "";
	Map session = ctx.getSession();
	if ("guest".equals(type)) {
		if (null == session.get("guest")) {
			result = Action.LOGIN;
		}
    } else {
    	if (null == session.get("user")) {
			result = Action.LOGIN;
		}
    }
	return "".equals(result) ? invocation.invoke() : result;
}