C#防止重復提交

C#防止重復提交


文章目錄

  • C#防止重復提交
  • 前言
  • 防止重復提交的思路
  • Web API 防止重復提交
    • 代碼實現
    • 代碼講解
    • 使用方法
  • MVC防止重復提交
  • 總結


前言

當用戶在前端進行提交數據時,如果網絡出現卡頓和前端沒有給出響應的話顧客通常都會狂點提交按鈕,這樣就很容易導致后端數據造成臟數據,眾所周知顧客就是老天爺,這種問題一定是咱有問題。下面我們就來看看如何避免這種情況吧。


防止重復提交的思路

防止重復提交我們可以才用緩存的方式存儲一個key在我們的Redis或者其他類型的緩存,再給它設置一個過期時間比如五秒或者三四秒,這個時間最好不要設置的過長,不然會影響用戶體驗。值得注意的是這個key一定要是與用戶一一對應且不會重復的!

Web API 防止重復提交

代碼實現

以下是具體的代碼實現:

// <summary>/// 防重復提交,api使用/// </summary>public class LockAttribute : ActionFilterAttribute{/// <summary>/// 攔截/// </summary>/// <param name="context"></param>/// <param name="next"></param>/// <returns></returns>public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next){Stopwatch sw = new Stopwatch();sw.Start();if (GlobalContext.SystemConfig.Debug == false){if (OperatorProvider.Provider.GetCurrent() == null){context.Result = new JsonResult(new AlwaysResult { state = ResultType.error.ToString(), message = "抱歉,沒有操作權限" });return;}else{string token = context.HttpContext.Request.Headers[GlobalContext.SystemConfig.TokenName].ParseToString();if (string.IsNullOrWhiteSpace(token)){context.Result = new JsonResult(new AlwaysResult { state = ResultType.error.ToString(), message = "token不能空" });return;}//固定加鎖5秒bool result = CacheHelper.SetNx(token, token, 5);if (!result){context.Result = new JsonResult(new AlwaysResult { state = ResultType.error.ToString(), message = "請求太頻繁,請稍后" });return;}}}await next();sw.Stop();}}

代碼講解

  • GlobalContext.SystemConfig.Debug :這里是讀取配置文件判斷是否為開發環境
  • OperatorProvider.Provider.GetCurrent():獲取顧客在系統中的權限
  • context.HttpContext.Request.Headers[GlobalContext.SystemConfig.TokenName]:這里是通過上線文獲取顧客的Token
  • CacheHelper.SetNx:這里是設置緩存:該方法會查詢緩存中是否已有該用戶的緩存信息,如果已經有了則返回false,沒有就設置該用戶的緩存并返回true。

使用方法

在這里插入圖片描述
直接以特性的形似使用,在需要進行鎖定的接口上標注即可

MVC防止重復提交

public class HandlerLockAttribute : ActionFilterAttribute
{public HandlerLockAttribute(){}public override void OnActionExecuting(ActionExecutingContext filterContext){if (OperatorProvider.Provider.GetCurrent() == null){WebHelper.WriteCookie("WaterCloud_login_error", "overdue");//filterContext.HttpContext.Response.WriteAsync("<script>top.location.href ='" + filterContext.HttpContext.Request.PathBase + "/Home/Error?msg=408" + "';if(document.all) window.event.returnValue = false;</script>");OperatorProvider.Provider.EmptyCurrent("pc_").GetAwaiter().GetResult();filterContext.Result = new RedirectResult(filterContext.HttpContext.Request.PathBase + "/Home/Error?msg=408");return;}else{string token = filterContext.HttpContext.Request.Cookies["pc_" + GlobalContext.SystemConfig.TokenName];string cacheToken = CacheHelper.GetAsync<string>("pc_" + GlobalContext.SystemConfig.TokenName + "_" + OperatorProvider.Provider.GetCurrent().UserId + "_" + OperatorProvider.Provider.GetCurrent().LoginTime).GetAwaiter().GetResult();if (string.IsNullOrWhiteSpace(token)){filterContext.Result = new JsonResult(new AlwaysResult { state = ResultType.error.ToString(), message = "token不能空" });return;}if (string.IsNullOrWhiteSpace(cacheToken)){filterContext.Result = new JsonResult(new AlwaysResult { state = ResultType.error.ToString(), message = "token不能空" });return;}if (token != cacheToken){filterContext.Result = new JsonResult(new AlwaysResult { state = ResultType.error.ToString(), message = "請求異常" });return;}//固定加鎖5秒bool result = CacheHelper.SetNx(token, token, 5);if (!result){filterContext.Result = new JsonResult(new AlwaysResult { state = ResultType.error.ToString(), message = "請求太頻繁,請稍后" });return;}}//隨機值base.OnActionExecuting(filterContext);}
}
  • OperatorProvider.Provider.EmptyCurrent(“pc_”).GetAwaiter().GetResult():此處是判斷如果顧客信息為空的話就清空當前登錄賬戶的緩存
  • CacheHelper.SetNx:這里是設置緩存:該方法會查詢緩存中是否已有該用戶的緩存信息,如果已經有了則返回false,沒有就設置該用戶的緩存并返回true。

總結

這里主要是通過過濾器實現的。這里順帶提一下,過濾器也屬于是AOP編程的體現哦。今日的分享就到此結束,有什么不懂的可以留言討論。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/66566.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/66566.shtml
英文地址,請注明出處:http://en.pswp.cn/web/66566.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python學opencv|讀取圖像(三十九 )閾值處理Otsu方法

【1】引言 前序學習了5種閾值處理方法&#xff0c;包括(反)閾值處理、(反)零值處理和截斷處理&#xff0c;還學習了一種自適應處理方法&#xff0c;相關文章鏈接為&#xff1a; python學opencv|讀取圖像&#xff08;三十三&#xff09;閾值處理-灰度圖像-CSDN博客 python學o…

嵌入式硬件篇---PID控制

文章目錄 前言第一部分&#xff1a;連續PID1.比例&#xff08;Proportional&#xff0c;P&#xff09;控制2.積分&#xff08;Integral&#xff0c;I&#xff09;控制3.微分&#xff08;Derivative&#xff0c;D&#xff09;控制4.PID的工作原理5..實質6.分析7.各種PID控制器P控…

日志收集Day001

1.ElasticSearch 作用&#xff1a;日志存儲和檢索 2.單點部署Elasticsearch與基礎配置 rpm -ivh elasticsearch-7.17.5-x86_64.rpm 查看配置文件yy /etc/elasticsearch/elasticsearch.yml&#xff08;這里yy做了別名&#xff0c;過濾掉空行和注釋行&#xff09; yy /etc/el…

集合帖:前綴和及差分模板題 ← 一維及二維

【一維前綴和及一維差分知識點】 ● 一維“前綴和數組”預處理過程&#xff1a;cin>>a[i], sum[i]sum[i-1]a[i] 或者 cin>>sum[i], sum[i]sum[i-1] &#xff08;1≤i≤n&#xff09; ● 一維“區間和”計算過程&#xff1a;sum[y]-sum[x-1] &#xff08;y…

《offer 來了:Java 面試核心知識點精講 -- 框架篇》(附資源)

繼上篇文章介紹了《offer 來了&#xff1a;Java 面試核心知識點精講 -- 原理篇》書后&#xff0c;本文章再給大家推薦兄弟篇 《offer來了&#xff1a;Java面試核心知識點精講--框架篇》&#xff0c; 簡直就是為Java開發者量身定制的面試神器。 本書是對Java程序員面試中常見的…

Low-Level 大一統:如何使用Diffusion Models完成視頻超分、去雨、去霧、降噪等所有Low-Level 任務?

Diffusion Models專欄文章匯總:入門與實戰 前言:視頻在傳輸過程中常常因為各種因素(如惡劣天氣、噪聲、壓縮和傳感器分辨率限制)而出現質量下降,這會嚴重影響計算機視覺任務(如目標檢測和視頻監控)的性能。現有的視頻修復方法雖然取得了一些進展,但通常只能針對特定的退…

Video-RAG:一種將視頻RAG新框架

1. 摘要及主要貢獻點 摘要&#xff1a; 檢索增強生成&#xff08;RAG&#xff09;是一種強大的策略&#xff0c;通過檢索與查詢相關的外部知識并將其整合到生成過程中&#xff0c;以解決基礎模型生成事實性錯誤輸出的問題。然而&#xff0c;現有的RAG方法主要集中于文本信息&…

Docker Load后存儲的鏡像及更改鏡像存儲目錄的方法

Docker Load后存儲的鏡像及更改鏡像存儲目錄的方法 Docker Load后存儲的鏡像更改鏡像存儲目錄的方法腳本說明注意事項Docker作為一種開源的應用容器引擎,已經廣泛應用于軟件開發、測試和生產環境中。通過Docker,開發者可以將應用打包成鏡像,輕松地進行分發和運行。而在某些場…

【零基礎入門unity游戲開發——unity通用篇37】鼠標指針(光標)修改隱藏鎖定(基于unity6開發介紹)

考慮到每個人基礎可能不一樣,且并不是所有人都有同時做2D、3D開發的需求,所以我把 【零基礎入門unity游戲開發】 分為成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】:主要講解C#的基礎語法,包括變量、數據類型、運算符、流程控制、面向對象等,適合沒有編程基礎的…

親測解決Latex File ended while scanning use of \@@BOOKMARK

這個問題只要刪除了.tex后綴文件外的其他同名文件&#xff0c;再次編譯即可。 環境 Win11 MikTex 問題原因 編譯的時候用了好幾種編譯器&#xff0c;然后編譯出現了錯誤。生成了不能使用的引用。 解決方法 刪除.tex后綴文件外的其他同名文件后&#xff0c;再次編譯。 筆…

Amazon MSK 開啟 Public 訪問 SASL 配置的方法

1. 開啟 MSK Public 1.1 配置 MSK 參數 進入 MSK 控制臺頁面&#xff0c;點擊左側菜單 Cluster configuration。選擇已有配置&#xff0c;或者創建新配置。在配置中添加參數 allow.everyone.if.no.acl.foundfalse修改集群配置&#xff0c;選擇到新添加的配置。 1.2 開啟 Pu…

Windows FileZila Server共享電腦文件夾 映射21端口外網連接

我有這樣一個使用場景&#xff0c;在外部網絡環境下&#xff0c;通過手機便捷地讀取存儲在電腦上的視頻文件。比如在外出旅行、出差&#xff0c;身邊沒有攜帶電腦&#xff0c;僅依靠手機設備&#xff0c;就能隨時獲取電腦里存儲的各類視頻&#xff0c;無論是學習資料視頻、工作…

MySQL 實戰 4 種將數據同步到ES方案

文章目錄 1. 前言2. 數據同步方案 2.1 同步雙寫2.2 異步雙寫2.3 定時更新2.4 基于 Binlog 實時同步 3. 數據遷移工具選型 3.1 Canal3.2 阿里云 DTS3.3 Databus3.4 Databus和Canal對比3.4 其它 4. 后記 上周聽到公司新同事分享 MySQL 同步數據到 ES 的方案&#xff0c;發現很有…

虛幻基礎-1:cpu挑選(14600kf)

能幫到你的話&#xff0c;就給個贊吧 &#x1f618; 文章目錄 ue非常吃cpu拉滿主頻打開項目編寫藍圖運行原因 時間長 關于壓力測試 本文以14600kf為例&#xff0c;雙12購入&#xff0c;7月份產。 ue非常吃cpu 經本人測試&#xff0c;ue是非常吃cpu的。 拉滿主頻 無論任何時間…

QTableWidget的簡單使用

1.最簡單的表格示例&#xff1a; ui->tableWidget->setRowCount(2);// 設置行數ui->tableWidget->setColumnCount(3);// 設置列數&#xff0c;一定要放在設置行表頭之前QStringList rowHeaderList;// 行表頭rowHeaderList << QStringLiteral("姓名"…

深入探究分布式日志系統 Graylog:架構、部署與優化

文章目錄 一、Graylog簡介二、Graylog原理架構三、日志系統對比四、Graylog部署傳統部署MongoDB部署OS或者ES部署Garylog部署容器化部署 五、配置詳情六、優化網絡和 REST APIMongoDB 七、升級八、監控九、常見問題及處理 一、Graylog簡介 Graylog是一個簡單易用、功能較全面的…

2024年我的技術成長之路

2024年我的技術成長之路 大家好&#xff0c;我是小寒。又到年底了&#xff0c;一年過得真快啊&#xff01;趁著這次活動的機會&#xff0c;和大家聊聊我這一年在技術上的收獲和踩過的坑。 說實話&#xff0c;今年工作特別忙&#xff0c;寫博客的時間比去年少了不少。不過還是…

嵌入式硬件篇---基本組合邏輯電路

文章目錄 前言基本邏輯門電路1.與門&#xff08;AND Gate&#xff09;2.或門&#xff08;OR Gate&#xff09;3.非門&#xff08;NOT Gate&#xff09;4.與非門&#xff08;NAND Gate&#xff09;5.或非門&#xff08;NOR Gate&#xff09;6.異或門&#xff08;XOR Gate&#x…

數據庫管理-第285期 Oracle 23ai:深入淺出向量索引(20250117)

數據庫管理285期 20245-01-17 數據庫管理-第285期 Oracle 23ai&#xff1a;深入淺出向量索引&#xff08;20250117&#xff09;1 HNSW事務支持解讀 2 IVF分區支持解讀 3 混合向量索引何時選擇混合向量索引為何選擇混合向量索引 總結 數據庫管理-第285期 Oracle 23ai&#xff1a…

行人識別檢測數據集,yolo格式,PASICAL VOC XML,COCO JSON,darknet等格式的標注都支持,準確識別率可達99.5%

作者簡介&#xff1a; 高科&#xff0c;先后在 IBM PlatformComputing從事網格計算&#xff0c;淘米網&#xff0c;網易從事游戲服務器開發&#xff0c;擁有豐富的C&#xff0c;go等語言開發經驗&#xff0c;mysql&#xff0c;mongo&#xff0c;redis等數據庫&#xff0c;設計模…