最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網 會員登陸 & 注冊

java如何防止重復請求?

2023-05-03 18:37 作者:Java一桶天下  | 我要投稿


日常業(yè)務開發(fā)中,處理重復請求應該是我們需要經常注意的,那么在Spring Boot中,防止重復請求的方法可以通過以下幾種方式實現:

1、Token 驗證

通過在頁面中生成一個唯一的Token,然后在請求中攜帶這個Token,服務端接收到請求后驗證Token是否正確。如果Token不正確,則認為是重復請求并拒絕處理。

代碼示例:

①、首先在頁面中生成一個唯一的Token

<form?id="myForm"?action="/submit"?method="post">
????<input?type="hidden"?name="token"?value="${token}"?/>
????<!--?其他表單元素?-->
????<button?type="submit">提交</button>
</form>

②、在服務端中接收請求并驗證Token

@RestController
public?class?MyController?{

????private?Map<String,?Boolean>?tokenMap?=?new?ConcurrentHashMap<>();

????@PostMapping("/submit")
????public?String?submit(HttpServletRequest?request)?{
????????String?token?=?request.getParameter("token");
????????if?(!tokenMap.containsKey(token))?{
????????????tokenMap.put(token,?true);
????????????//?處理請求
????????????return?"success";
????????}?else?{
????????????//?重復請求
????????????return?"error";
????????}
????}
}

2、Token 桶算法

在服務端使用Token桶算法對請求進行限制,每個用戶都有一個Token桶,每次請求需要從Token桶中獲取一個Token,如果Token桶中沒有Token,則認為是重復請求并拒絕處理。

代碼示例:

@RestController
public?class?MyController?{

????private?Map<String,?LinkedList<Long>>?tokenBucketMap?=?new?ConcurrentHashMap<>();

????@PostMapping("/submit")
????public?String?submit(HttpServletRequest?request)?{
????????String?userId?=?request.getParameter("userId");
????????LinkedList<Long>?tokenBucket?=?tokenBucketMap.get(userId);
????????if?(tokenBucket?==?null)?{
????????????tokenBucket?=?new?LinkedList<>();
????????????tokenBucketMap.put(userId,?tokenBucket);
????????}
????????long?currentTime?=?System.currentTimeMillis();
????????synchronized?(tokenBucket)?{
????????????if?(tokenBucket.size()?<?10?||?currentTime?-?tokenBucket.getFirst()?>?60000)?{
????????????????tokenBucket.addLast(currentTime);
????????????????if?(tokenBucket.size()?>?10)?{
????????????????????tokenBucket.removeFirst();
????????????????}
????????????????//?處理請求
????????????????return?"success";
????????????}?else?{
????????????????//?重復請求
????????????????return?"error";
????????????}
????????}
????}
}

3、限流控制

通過在請求接口中設置一個時間間隔,例如5秒鐘,同一個用戶在5秒鐘內只能請求一次,如果再次請求則認為是重復請求并拒絕處理。

代碼示例:

@RestController
public?class?MyController?{

????private?Map<String,?Long>?lastRequestTimeMap?=?new?ConcurrentHashMap<>();

????@PostMapping("/submit")
????public?String?submit(HttpServletRequest?request)?{
????????String?userId?=?request.getParameter("userId");
????????Long?lastRequestTime?=?lastRequestTimeMap.get(userId);
????????if?(lastRequestTime?==?null?||?System.currentTimeMillis()?-?lastRequestTime?>?5000)?{
????????????lastRequestTimeMap.put(userId,?System.currentTimeMillis());
????????????//?處理請求
????????????return?"success";
????????}?else?{
????????????//?重復請求
????????????return?"error";
????????}
????}
}

4、接口冪等性設計

通過設計接口的冪等性來防止重復請求。在設計接口時,確保同樣的請求不管發(fā)送多少次都會得到相同的結果,這樣即使用戶發(fā)送了重復請求,服務端也可以正常處理,不會對系統(tǒng)產生影響。

@RestController
public?class?MyController?{

????private?Map<String,?String>?resultCache?=?new?ConcurrentHashMap<>();

????@PostMapping("/submit")
????public?String?submit(HttpServletRequest?request)?{
????????String?key?=?request.getParameter("key");
????????String?result?=?resultCache.get(key);
????????if?(result?!=?null)?{
????????????//?返回之前的結果
????????????return?result;
????????}?else?{
????????????//?處理請求并緩存結果
????????????result?=?doBusinessLogic();
????????????resultCache.put(key,?result);
????????????return?result;
????????}
????}

????private?String?doBusinessLogic()?{
????????//?業(yè)務邏輯處理
????????return?"success";
????}
}


java如何防止重復請求?的評論 (共 條)

分享到微博請遵守國家法律
平塘县| 崇左市| 靖安县| 珲春市| 呼和浩特市| 恩平市| 镇巴县| 遂平县| 衡阳市| 吉安市| 彭山县| 马龙县| 兴海县| 健康| 桂平市| 梅河口市| 衡阳市| 遂宁市| 黑河市| 五莲县| 崇左市| 蒲城县| 游戏| 梅河口市| 长治县| 永德县| 江津市| 陇川县| 周至县| 贵德县| 平泉县| 东海县| 都江堰市| 宿迁市| 台湾省| 诏安县| 车致| 肃南| 万源市| 鸡西市| 运城市|