nablarch.common.web.token.OnDoubleSubmission Maven / Gradle / Ivy
package nablarch.common.web.token;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import nablarch.core.repository.SystemRepository;
import nablarch.core.util.annotation.Published;
import nablarch.fw.ExecutionContext;
import nablarch.fw.Interceptor;
import nablarch.fw.web.HttpRequest;
import nablarch.fw.web.HttpResponse;
/**
* 二重サブミットを防止する{@link Interceptor}。
*
* 業務アクションハンドラのメソッドに付与することで、二重サブミット(同一リクエストの二重送信)のチェックを行う。
*
*
*
* 本インターセプタを使用するためには、トークン設定が必要である。
* トークン設定はトークンの生成とHTMLへの埋め込みがある。
* トークンの生成は{@link UseToken}でできる。
* HTMLへの埋め込みはリクエストに格納されたトークンをテンプレートエンジンでinput要素を組み立てればよい。
* Thymeleafの例を示す。
*
* {@code }
*
*
* JSPを使用している場合はn:formタグでトークンを設定できる。
*
*
* {@code
*
* }
*
* 本インターセプタは、業務アクションハンドラに次のように実装する。
*
* {@code @OnDoubleSubmission(path = "XXX.jsp")}
* {@code @OnError(type = ApplicationException.class, path = "forward://XXX.html")
* public HttpResponse handle(HttpRequest req, ExecutionContext ctx) {
* // 省略
* }}
*
*
* @author Kiyohito Itoh
*/
@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Interceptor(OnDoubleSubmission.Impl.class)
@Published
public @interface OnDoubleSubmission {
/**
* 二重サブミットと判定した場合の遷移先のリソースパスを返す。
* 個別に遷移先を変更する場合に指定する。
* リソースパスは必須項目であり、指定しなかった場合は{@link NullPointerException}が発生する。
*/
String path() default "";
/**
* 二重サブミットと判定した場合の遷移先画面に表示するエラーメッセージに使用するメッセージIDを返す。
* 個別にメッセージIDを変更する場合に指定する。
* デフォルトでは、アプリケーション設定一覧表_presetで設定したエラーメッセージが使用される。
*/
String messageId() default "";
/**
* 二重サブミットと判定した場合のレスポンスステータスを返す。
* 個別にレスポンスステータスを変更する場合に指定する。
* デフォルトでは、{@link BasicDoubleSubmissionHandler}のフィールドに定義されている400を返す。
*/
int statusCode() default -1;
/**
* {@link OnDoubleSubmission}アノテーションのインターセプタ。
* トークンをチェックし、二重サブミットの場合は指定された画面遷移を行うための{@link HttpResponse}を返す。
* @author Kiyohito Itoh
*/
public static class Impl
extends Interceptor.Impl {
/** リポジトリから{@link DoubleSubmissionHandler}を取得できない場合に使用するデフォルトハンドラ */
private static final DoubleSubmissionHandler DEFAULT_HANDLER = new BasicDoubleSubmissionHandler();
/** {@link DoubleSubmissionHandler}をリポジトリから取得する際に使用する名前 */
private static final String DOUBLE_SUBMISSION_HANDLER_NAME = "doubleSubmissionHandler";
/**
* {@inheritDoc}
*
* {@link DoubleSubmissionHandler}を実装したクラスに処理を委譲する。
* {@link DoubleSubmissionHandler}は"doubleSubmissionHandler"という名前でリポジトリから取得する。
* リポジトリから{@link DoubleSubmissionHandler}を取得できない場合は、{@link BasicDoubleSubmissionHandler}を使用する。
*
*/
public HttpResponse handle(HttpRequest request, ExecutionContext context) {
DoubleSubmissionHandler handler = (DoubleSubmissionHandler) SystemRepository.getObject(DOUBLE_SUBMISSION_HANDLER_NAME);
if (handler == null) {
handler = DEFAULT_HANDLER;
}
return handler.handle(request, context, getOriginalHandler(), getInterceptor());
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy