重複提交兩種解決方案

2021-09-05 12:27:27 字數 1842 閱讀 6558

時序圖

新增流程圖

code生成規則:sessionid+"_"+uuid,防止csrf攻擊

code校驗規則:判斷code相等後,從session中移除code的操作,會放在同步**塊中執行。如果所有請求用同乙個鎖物件,會有一定的效能消耗,為了降低同步鎖引起的效能消耗,根據不同的sessionid建立不同的鎖,並儲存在全域性map中。在每次服務端接收請求後,從code中解析出sessionid,並根據sessionid從map取出鎖物件,如果map中沒有該sessionid,則新建立乙個鎖物件,將該sessionid和鎖物件存入map

示意**

public class synchronizeddemobysessionid 

//解析sessionid

string codes = code.split("_");

string sessionid = codes[0];

//jsessionid為空的情況,服務端會重新生成sessionid,map中之前的sessionid就變成了髒資料,需要清空

cookie cookies = request.getcookies();

string jsessionid = null;

if (cookies != null && cookies.length > 0)}}

if (stringutils.isblank(jsessionid))

//當使用者不訪問列表頁,直接訪問新增介面時,codeobject為null

object codeobject = session.getattribute("code");

if (codeobject == null)

//根據sessionid取出鎖物件

object lock = lockmap.get(sessionid);

if (lock == null)

//同步**塊,來自不同的sessionid的請求加不同的鎖,同一sessionid的請求加同一把鎖

string _code = codeobject.tostring();

synchronized (lock)else }}

}

時序圖

新增流程圖

code生成規則:每次請求壓測記錄列表時,都初始化為隨機整數,防止csrf攻擊

code校驗規則:新增壓測記錄時,前端每次傳送請求,都將code自增,服務端將code加1,比較前端傳的code和服務端的code是否相等,相等,則允許提交;不相等,則不允許提交,返回前端資訊,請不要重複提交。

示意**

//從session中取出code

object codeobject = session.getattribute("code");

//1、jsessionid為空的情況,codeobject為null

//2、當使用者不訪問列表頁,直接訪問新增介面時,codeobject為null

if (codeobject == null)

int _code = integer.parseint(codeobject.tostring());

_code = _code + 1;

//比較前端code和服務端code

if (code.intvalue() == _code)else

}

重複提交解決方案

struts 的token 機制能夠很好的解決表單重複提交的問題,基本原理是 伺服器端在處理到達的請求之前,會將請求中包含的令牌值與儲存在當前使用者會話中的令牌值進行比較,看是否匹配。在處理完該請求後,且在答 送給客戶端之前,將會產生乙個新的令牌,該令牌除傳給客戶端以外,也會將使用者會話中儲存的舊的...

重複提交的解決方案

解決方案 js判斷 token驗證 想法一 應將按鈕隱藏或變灰,使其不可重複點選。var flog true function onsubmit success function data 想法二 設定引數,前後臺約定好特殊值,然後只有等於特殊值的時候,該資料才是有效的。var flog true ...

跨域的兩種解決方案

方案一 configuration public class webmvcconfigure extends webmvcconfigureradapter 方案二 component public class jsonfilter implements filter override public...