1. 程式人生 > >SpringBoot防止重複請求,重複表單提交超級簡單的註解實現之三(升級版2)

SpringBoot防止重複請求,重複表單提交超級簡單的註解實現之三(升級版2)

升級攔截器

上一篇文章留下2個問題

1.某些情況下request獲取不到,或造成異常情況,為了處理這種情況我將獲取Request的方法進行了升級

2.能不能在異常發生的時候就將重複提交標記就移除呢?當然可以!通過@AfterThrowing即可實現

下面是改造後的攔截器程式碼:

/** * @description 防止表單重複提交攔截器 */
@Aspect
@Component
@Slf4j
public class DuplicateSubmitAspect {
    public static final String  DUPLICATE_TOKEN_KEY="duplicate_token_key"
; @Pointcut("execution(public * cn.test.core.controller..*(..))") public void webLog() { } @Before("webLog() && @annotation(token)") public void before(final JoinPoint joinPoint, DuplicateSubmitToken token){ if (token!=null){ ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes
(); HttpServletRequest request = attributes.getRequest(); boolean isSaveSession=token.save(); if (isSaveSession){ String key = getDuplicateTokenKey(joinPoint); Object t = request.getSession().getAttribute(key); if (null==t){ String uuid= UUID.randomUUID
().toString(); request.getSession().setAttribute(key.toString(),uuid); log.info("token-key="+key); log.info("token-value="+uuid.toString()); }else { throw new DuplicateSubmitException(TextConstants.REQUEST_REPEAT); } } } } /** * 獲取重複提交key * @param joinPoint * @return */ public String getDuplicateTokenKey(JoinPoint joinPoint) { String methodName = joinPoint.getSignature().getName(); StringBuilder key=new StringBuilder(DUPLICATE_TOKEN_KEY); key.append(",").append(methodName); return key.toString(); } @AfterReturning("webLog() && @annotation(token)") public void doAfterReturning(JoinPoint joinPoint,DuplicateSubmitToken token) { // 處理完請求,返回內容 log.info("出方法:"); if (token!=null){ ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); boolean isSaveSession=token.save(); if (isSaveSession){ String key = getDuplicateTokenKey(joinPoint); Object t = request.getSession().getAttribute(key); if (null!=t){ request.getSession(false).removeAttribute(key); } } } } /** * 異常 * @param joinPoint * @param e */ @AfterThrowing(pointcut = "webLog()&& @annotation(token)", throwing = "e") public void doAfterThrowing(JoinPoint joinPoint, Throwable e, DuplicateSubmitToken token) { if (null!=token && e instanceof DuplicateSubmitException==false){ //處理處理重複提交本身之外的異常 ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); boolean isSaveSession=token.save(); //獲得方法名稱 if (isSaveSession){ String key=getDuplicateTokenKey(joinPoint); Object t = request.getSession().getAttribute(key); if (null!=t){ //方法執行完畢移除請求重複標記 request.getSession(false).removeAttribute(key); log.info("異常情況--移除標記!"); } } } } }
3.使用:在你要使用的控制器要防止重複提交的方法添加註解@DuplicateSubmitToken即可
4.總結:有時候我們在思考問題的時候可以換一種思路,多考慮下是否還有其他方式。

如果你覺得幫助到了你,用你的愛心點個贊吧!謝謝!

也可以加入我們的qq群220282789,只為相互幫助,只為一起進步!

作者:天空藍藍的     
版權所有,歡迎保留原文連結進行轉載:)

相關推薦

SpringBoot防止重複請求重複提交超級簡單註解實現升級2

升級攔截器上一篇文章留下2個問題1.某些情況下request獲取不到,或造成異常情況,為了處理這種情況我將獲取Request的方法進行了升級2.能不能在異常發生的時候就將重複提交標記就移除呢?當然可以!通過@AfterThrowing即可實現下面是改造後的攔截器程式碼:/**

SpringBoot防止重複請求重複提交超級簡單註解實現終極

前言:上篇文章有的童鞋說不行啊,怎麼不能防止重複提交呢! 首先需要說明的是之前的防止重複提交是指:一次請求完成之前防止重複提交,當然擴充套件下就可以做到會話間防止重複提交,還可以擴充套件為某個時間段或者永久防止重複提交(這個我就不實現了),下面我來擴充套件一下相同會話防止重

springboot打war包部署tomcat服務器以及提交數據亂碼處理

style 但是 thymeleaf move javaweb 1.8 生成 地址欄 defaults   小白覺得springboot打成jar包直接使用內嵌的tomcat或jetty容器(java -jar xxx.jar)運行項目不利於定位問題,我還是習慣於查看tom

轉載:關於ajaxform提交http請求提交的區別

https://www.cnblogs.com/lidgblogs/archive/2017/09/01/7403828.htmlajax模仿form上傳:<!doctype html> <html lang="en"> <head>

Laravel提交獲取提交上來的資料

1、新建表單(一般我們都是直接使用HTML的<form><input/></form>來新建表單) Laravel可以使用如下方式新建表單: (1)開啟https://packalyst.com/packages/package/laravelcollect

ajax提交form提交onsubmit="return checksubmit()"提交驗證

Ajax提交的兩種方式: 一是url引數提交資料, 二是form提交(和平常一樣在後臺可以獲取到Form表單的值)。在所要提交的表單中,如果元素很多的話建議用第二種方式進行提交 一.Url引數提交資料 <script type="text/javascript"&g

SpringBoot+Ajax檔案上傳+FormData提交

需求 前端: html定義好form表單的輸入資訊(text+file)標籤 js通過Ajax非同步提交表單中的內容。 後端: 通過介面接收表單中的資料(String+MultipartFil

下拉框設定disabled屬性form提交後臺拿不到相應的值

給某個下拉框設定不可選,但是form表單提交以後拿不到該下拉框對應的值$("#type").attr("disabled","disabled");解決方法:form表單提交之前,jquery將該屬性去掉即可 $("#type").removeAttr("disabled")

實現檔案上傳以及提交成功的回撥函式

主要將實現一下兩個功能: 1、使用commons-fileupload實現檔案的上傳(包括圖片);2、使用jquery-form.js實現表單提交成功的回撥函式。 <%@ page language="java" contentType="text/html;

AJAX PHP無刷新form提交簡單實現(推薦)

username mime win root 支持 對象 希望 meta {} 下面小編就為大家帶來一篇AJAX PHP無刷新form表單提交的簡單實現(推薦)。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧 ajax.php <

VUE中關於提交簡單實現

eat style OS 關於 select city ole temp console main.js import Vue from "../vue.js"; import App from "./App.js"; //啟動 new Vue({ el:"#ap

附件上傳與刪除思路梳理含前臺程式碼

      附件上傳是進行表單操作時經常會用到的功能,下面詳細介紹前臺檔案上傳程式碼的思路,並附最新程式碼。      首先在前臺我們使用的是jQuery的File Upload元件,該元件以jquery的ajax為基礎,支援多檔案的上傳、取消和刪除,在使用該元件前,需要引入

form的onsubmit事件--提交前的驗證實現方式

onsubmit:表單提交前自動執行指定的東西; 注意: onsubmit=“return check()”中的return是一定要加上的,不然check的返回值哪怕是false,仍然提交。也就是說,onsubmit=“return false”為不執行提交;onsubmi

【高併發】秒殺系統架構解密不是所有的秒殺都是秒殺升級!!

## 寫在前面 > 很多小夥伴反饋說,高併發專題學了那麼久,但是,在真正做專案時,仍然不知道如何下手處理高併發業務場景!甚至很多小夥伴仍然停留在只是簡單的提供介面(CRUD)階段,不知道學習的併發知識如何運用到實際專案中,就更別提如何構建高併發系統了! 究竟什麼樣的系統算是高併發系統?今天,我們就一

Jquery 實現提交按鈕變灰防止多次點選提交重複資料

    表單提交時候我們應該控制提交按鈕,不能點選多次進行資料的重複提交。要不然就會有冗餘的重複的資料在系統中,造成系統出現數據垃圾。jQuery很簡單的就可以實現對錶單提交按鈕控制,下面就是相關的例子和程式碼。 <form action="${pageContex

Java防止非法和重複提交的分析

第一,對於不支援POST的,可以簡單的使用如下程式碼 if ("POST".equals(request.getMethod())) {  // 正常進行}else{  // 異常請求  out.print("異常訪問");  return;} 如果是servlet, 可以

jq提交時 禁用提交按鈕 防止重複提交 jq方法

防止表單重複提交 function(event,options){ $("#submit_login").attr({"disabled":"disabled"}); var needtime =

十九、python學習Django框架(二):請求、URL路徑引數、查詢字串、請求體()、請求

一、請求 1.flask中,利用HTTP協議想伺服器傳參的幾種途徑 1.1 提取URL的特定部分,可以在伺服器端的路由中用正則表示式擷取: 如:/weather/2018 //前端傳送請求: $.ajax({ url:'http://www.baidu.com/

SQL 聯合主鍵跨刪除最小時間那條重複資料 for UPdate

一、過濾出需要刪除的重複資料的ID select  aac001  from ei_app_recheck_citi_id inner join std_app on std_app.app_id=ei_app_recheck_citi_id.app_id where s

如何避免提交重複資料

提交表單的過程中如何避擴音交重複資料 在提交表單時,需要避免因 “網路卡頓” 或 “使用者在提交時點選多次提交按鈕” 而造成新增資料重複。 案例 <form name="f1" action="#" > ... <input id="butt