1. 程式人生 > >避免重複提交解決方案之一

避免重複提交解決方案之一

一、定義一個註解用於標註需要校驗重複提交的方法

package com.xwolf.boot.annotation;

import java.lang.annotation.*;

/**
 * 避免重複提交
 * @author xwolf
 * @version 1.0
 * @since 1.8
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AvoidRepeatableCommit {

    /**
     * 指定時間內不可重複提交,單位毫秒
     * @return
     */
    long timeout()  default 30000 ;

}

二、新增一個切面用於校驗來自同一IP地址的重複提交請求

package com.xwolf.boot.aspect;

import com.xwolf.boot.annotation.AvoidRepeatableCommit;
import com.xwolf.boot.config.Constants;
import com.xwolf.boot.utils.IPUtil;
import com.xwolf.boot.utils.StringUtils;
import com.xwolf.boot.utils.UUIDUtil;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.Order;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.util.concurrent.TimeUnit;

/**
 * 重複提交aop
 * @author xwolf
 * @version 1.0
 * @since 1.8
 */
@Order
@Aspect
@Component
@Slf4j
public class AvoidRepeatableCommitAspect {

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * @param point
     */
    @Around("@annotation(com.xwolf.boot.annotation.AvoidRepeatableCommit)")
    public Object around(ProceedingJoinPoint point) throws Throwable {

        HttpServletRequest request  = ((ServletRequestAttributes)RequestContextHolder.currentRequestAttributes()).getRequest();
        String ip = IPUtil.getIP(request);
        //獲取註解
        MethodSignature signature = (MethodSignature) point.getSignature();
        Method method = signature.getMethod();
        //目標類、方法
        String className = method.getDeclaringClass().getName();
        String name = method.getName();
        String ipKey = String.format("%s#%s",className,name);
        int hashCode = Math.abs(ipKey.hashCode());
        String key = String.format("%s_%d",ip,hashCode);
        log.info("ipKey={},hashCode={},key={}",ipKey,hashCode,key);
        AvoidRepeatableCommit avoidRepeatableCommit =  method.getAnnotation(AvoidRepeatableCommit.class);
        long timeout = avoidRepeatableCommit.timeout();
        if (timeout < 0){
            timeout = Constants.AVOID_REPEATABLE_TIMEOUT;
        }
        String value = (String) redisTemplate.opsForValue().get(key);
        if (StringUtils.isNotBlank(value)){
            return "請勿重複提交";
        }
        redisTemplate.opsForValue().set(key, UUIDUtil.uuid(),timeout,TimeUnit.MILLISECONDS);
        //執行方法
        Object object = point.proceed();
        return object;
    }

}


三、對需要檢驗重複提交的方法添加註解

 /**
     * 新增使用者
     * @param user
     * @return
     */
    @PostMapping(value = "add")
    @AvoidRepeatableCommit(timeout = 50000)
    public String insert(@Valid User user){
        // user.setBirth(new Date());
        log.info("請求引數:{}",user);
        return userService.insert(user);
    }

方案出自:https://github.com/fkandy/boot/tree/master/src/main/java/com/xwolf/boot

相關推薦

避免重複提交解決方案之一

一、定義一個註解用於標註需要校驗重複提交的方法package com.xwolf.boot.annotation; import java.lang.annotation.*; /** * 避免重複提交 * @author xwolf * @version 1.0

SpringMVC後臺token防重複提交解決方案

本文介紹如何使用token來防止前端重複提交的問題。 目錄 1.思路 2.攔截器原始碼實現 3.註解原始碼 4.攔截器的配置 5.使用指南 6.結語 思路 1.新增攔截器,攔截需要防重複提交的請求 2.通過註解@Token來新增token/移除token 3

IIS無法啟動,應用程序池自動關閉,應用程序池XXXX將被自動禁用 解決方案之一

nbsp 問題 -- content 其中 iis service .com 裏的 是上網找各種相關資料。其中解決該問題的前半段是用如下這個帖子的方法。 http://www.360doc.com/content/14/1119/01/16402602_426289088.

svn報錯“請求的名稱有效 但是找不到請求的類型的數據”的解決方案之一

svn 報錯 請求   昨天收到同事的易信,說是svn不能用了。  由於只有他自己反映無法使用,而且,我使用svn也沒有問題。因此,這事基本應該和服務沒什麽關系。看了一下進程,也沒什麽問題。[[email protected]/* */ svndata]# ps -ef|grep sv

js新開窗口避免瀏覽器攔截解決方案

瀏覽器 oca cat 解決方案 bsp lse span 方案 return Ajax毀掉函數中,打開新窗口解決方案 var w = window.open(); $.post("GetHomToTestPaper", {homeworkName:hom

http 返回碼 405 解決方案之一

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

ShedLock-輕量級分散式定時任務重複執行解決方案

什麼是ShedLock ShedLock是一個在分散式環境中使用的定時任務框架,用於解決在分散式環境中的多個例項的相同定時任務在同一時間點重複執行的問題,解決思路是通過對公用的資料庫中的某個表進行記錄和加鎖,使得同一時間點只有第一個執行定時任務併成功在資料庫表中寫入相應記錄的節點能夠成功

vuejs新增環境常量----多環境開發打包場景解決方案之一

1、在congig目錄下面新增新的js 'use strict' const chalk = require('chalk') /* * 環境列表,第一個環境為預設環境 * envName: 指明現在使用的環境 * dirName: 打包的路徑,只在build的時候有用 * baseUrl:

Mysql海量資料儲存和解決方案之一—分散式DB方案

    面對這樣的一個表,我們怎樣切分呢?怎樣將這樣的資料分佈到不同的資料庫中的表中去呢?其實分析blog的應用,我們不難得出這樣的結論:blog的應用中,使用者分為兩種:瀏覽者和blog的主人。瀏覽者瀏覽某個blog,實際上是在一個特定的使用者的blog下進行瀏覽的,而blog的主人管理自己的blog,也同

後端伺服器如何簡單的避免重複提交

業務場景:使用者點選購買後,修改訂單狀態,修改使用者賬戶餘額,並新增使用者消費記錄。 分析:這裡在同一個事務裡有三個動作,兩個是更新,一個是新增。如果這時候在更新完出現併發情況,那麼使用者消費記錄可能會多出一條,使用者賬戶餘額也可能出現錯誤。那麼該如何防止呢?在修改前查詢

idea webStorm 報錯 Unescaped xml character 解決方案之一

為什麼會有這個報錯: 是因為idea認為這樣寫可能不是很合適。 執行時應該沒有問題,如果你想禁用掉這個提示,請自行搜尋修改idea提示的,別的答案比如這個 嘗試修改文件型別 修改為: <

雙緩衝技術解決方案之一:儲存所有要繪製內容,全屏重繪

package com.loaderman.customviewdemo; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import androi

XSS攻擊解決方案之一(過濾器)

一、XssFilter.java package com.stylefeng.roses.core.xss; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import jav

拉取遠端程式碼時與原生代碼衝突的解決方案之一

一、本解決方案基於IDEA開發工具講解 ①基於stash     首先,右擊專案--》git---》repository----》pull 拉取遠端專案,出現failed時,不要慌張不要悲傷,黎明的時光會到來,穩住心態,開啟滅 ‘’滅霸模式‘’。     接著我們繼續操

Grade重複依賴解決方案-compileOnly

最受歡迎的Gradle功能之一剛剛到達了2.12版:支援宣告只編譯依賴關係。對於熟悉Maven的Java開發人員,只有編譯的依賴關係與Maven的provided範圍相似,只允許在編譯時使用非傳遞依賴關係。儘管Gradle War Plugin的使用者可以使

關於win10能上qq不能聯網的問題解決方案之一

作為剛剛將系統從win7升到了win10,興奮不已。 可是隨後發現開啟chrome居然無法開啟任何網站,然後嘗試開啟QQ,卻是正常執行的。 這時我使用騰訊的電腦管家進行網路修復,無論是修改dns還是下載新的瀏覽器,均失敗告終。 同時使用系統自行診斷網路問題的結果是  沒有問

Win10高分屏筆記本更改DPI後軟體介面字型變模糊的解決方案之一

其實這也不是一種完整的解決方案,但是相比之下是比較好的。不得不說微軟不完蛋,沒有天理啊。 問題是這樣的: 最近換了一臺高分屏的筆記本,發現其推薦顯示設定是放大到125%,因為100%的時候所有的字型都太小了。放到125%似乎好很多,但是很多軟體的介面變模糊了,包括Windo

Linux 中文字型終極解決方案之一

[Veiz]以前沒有支援ClearType的中文字型,Xwindows 上的中文顯示效果難盡人意。 現在微軟新開發了一種支援ClearType的中文字型——微軟雅黑。 安裝了 Windows Vista 或 Offi

jquery動態新增元素無法提交解決方案

昨天寫了一個頁面,裡面涉及到動態的建立和修改表單控制元件(form controls),用到的修改新增元素的方式為jquery方法為append,和replaceWith方法,凡是原有的控制元件後臺都可以獲取到值,凡是動態改變的元素,都無法獲取值,這些控制元件當然都包含了na

android藍芽搜尋重複新增解決方案

Android藍芽Chat例項執行在全信手機出現未匹配手機重複新增至列表的現象(小米手機正常),原先程式碼如下: // The BroadcastReceiver that listens for discovered devices and // chan