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
轉載:關於ajax,form表單提交,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