コメントを達成するために超簡単再送要求、重複したフォームの送信を防ぐSpringBoot

1.ノートインタフェース 
 

/ **
* @description注釈を繰り返すフォームを防止
* /
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
公共@interface DuplicateSubmitToken {

//重複保存するマーカーをデフォルトとして保存する必要があるコミット
をtrueにブール保存()デフォルト;
}
2.カスタム例外クラスを

 

/ **
*繰り返し例外を送信する
* /
のRuntimeException {延びDuplicateSubmitExceptionパブリッククラス
パブリックDuplicateSubmitException(文字列MSG){
スーパー(MSG)を;
}

公共DuplicateSubmitException(文字列MSG、Throwableの原因){
スーパー(MSG、原因)。
}
}
 

3.インターセプター
 
/ **
* @descriptionはブロッカー繰り返すようにフォームを防止
* /
@Aspect
@Component
@ SLF4J
パブリッククラスDuplicateSubmitAspect {
公共の静的な文字列DUPLICATE_TOKEN_KEY決勝= "duplicate_token_keyを"。

@Pointcut( "実行(公開* cn.test.core.controller .. *(..))")

公共ボイドブログ(){
}

@Before( "ウェブログ()&& @Annotation(トークン)")
最終ジョインポイントジョインポイント、DuplicateSubmitTokenトークン)前公共ボイド{
IF(!トークン= NULL){
オブジェクト[]引数の=のjoinPoint.getArgs()。
HttpServletRequestのリクエスト= NULL;
HttpServletResponseの応答= NULL;
以下のために(INT i = 0; I <args.length; iは++){
IF(引数[I]のinstanceofのHttpServletRequest){
リクエスト=(HttpServletRequestの)引数[i]は、
}
IF(引数[i]がinstanceofのHttpServletResponseの){
応答=(HttpServletResponseの)引数を[I]。
}
}

ブールisSaveSession = token.save()。
(isSaveSession){もし
文字列キー= getDuplicateTokenKey(ジョインポイント)。
オブジェクトT =でrequest.getSession()のgetAttribute(キー)。
IF(ヌル== T){
文字列のUUID = UUID.randomUUID()のtoString()。
でrequest.getSession()のsetAttribute(key.toString()、UUID)。
log.info(「トークンキー=」+キー)
log.info( "トークン値=" + uuid.toString())。
}他{
新しいDuplicateSubmitException(TextConstants.REQUEST_REPEAT)を投げます。
}
}

}
}

/ **
*获取重复提交キー- > duplicate_token_key + '' +请求方法名
* @paramジョインポイント
* @return
* /
パブリック文字列getDuplicateTokenKey(ジョインポイントジョインポイント){
文字列methodNameの= joinPoint.getSignature()のgetName();。
StringBuilderのキー=新しいStringBuilderの(DUPLICATE_TOKEN_KEY)。
key.append( "")(methodNameの)追加。
key.toStringを返します();
}

@AfterReturning( "ウェブログ()&& @Annotation(トークン)")
公共ボイドdoAfterReturning(ジョインポイントジョインポイント、DuplicateSubmitTokenトークン){
//处理完请求、内容返り
log.info( "出来方法:")。
IF(!トークン= NULL){
オブジェクト[]引数の=のjoinPoint.getArgs()。
HttpServletRequestのリクエスト= NULL;
以下のために(INT i = 0; I <args.length; iは++){
IF(引数[I]のinstanceofのHttpServletRequest){
リクエスト=(HttpServletRequestの)引数[i]は、
}
}
ブールisSaveSession = token.save()。
(isSaveSession){もし
文字列キー= getDuplicateTokenKey(ジョインポイント)。
オブジェクトT =でrequest.getSession()のgetAttribute(キー)。
もし(ヌル= T!){
//方法执行完毕移除请求重复标记
でrequest.getSession(false)を.removeAttribute(キー);
log.info( "メソッドの削除要求リピートフラグが終了します!");
}
}
}
}

/ **
*异常
* @paramジョインポイント
* @param電子
* /
@AfterThrowing(ポイントカット= "ウェブログ()&& @Annotation(トークン)"、= "e"を投げる)
公共ボイドdoAfterThrowing(ジョインポイントジョインポイント、ThrowableのE、DuplicateSubmitTokenトークン){
!IF(ヌル=トークン
&& EのinstanceofのDuplicateSubmitException ==偽){
//处理处理重复提交本身之外的异常
)([]引数の=のjoinPoint.getArgsオブジェクト。
HttpServletRequestのリクエスト= NULL;
以下のために(INT i = 0; I <args.length; iは++){
IF(引数[I]のinstanceofのHttpServletRequest){
リクエスト=(HttpServletRequestの)引数[i]は、
}
}
ブールisSaveSession = token.save()。
//获得方法名称
IF(isSaveSession){
キーgetDuplicateTokenKey =文字列(ジョインポイント)
。Tは=でrequest.getSessionオブジェクト()のgetAttribute(キー);
IF(!T = NULL){
//メソッドが重複要求フラグ除去終了
(偽).removeAttribute(キーでrequest.getSessionを);
log.info(「例外-削除要求リピートフラグ!」);
}
}
}
}
}
4.コントローラが使用:あなたは注釈を追加するために、重複提出コントローラメソッドを避けたい@DuplicateSubmitToken
/ **
* @description
* /
@RestController
パブリッククラスTestController {
@RequestMapping(値= "/テスト"、メソッド= RequestMethod.GET)
パブリックマップの<string、オブジェクト> firstResp(HttpServletRequestのリクエスト){
マップの<string、オブジェクト> =地図HashMapの新しい新しい<>();
でrequest.getSession()のsetAttribute( "リクエストのURL"、リクエスト..getRequestURL())。
map.put( "要求URL"、request.getRequestURL());
マップを返します。
}

@DuplicateSubmitToken
@RequestMapping(値= "/試験/ D"、メソッド= RequestMethod.GET)
パブリックマップの<string、オブジェクト>試験(HttpServletRequestのリクエスト){

ランダムはr =新しいランダム();
INT I = r.nextInt(3)。
(I == 2){場合
( "有异常")新しいCustomExceptionを投げます。
}

{試す
のThread.sleep(5000);
}キャッチ(InterruptedExceptionある電子){
e.printStackTrace();
}

地図<文字列、オブジェクト>マップ=新しいHashMapの<>();
でrequest.getSession()のsetAttribute( "要求URL"、request.getRequestURL());
map.put( "要求URL"、request.getRequestURL());
マップを返します。
}
}
5.测试略过...

おすすめ

転載: www.cnblogs.com/bevis-byf/p/11491547.html