但凡web开发中都会有户多次点击了提交按钮导致多次提交的情况,一般的集中做法

1、通过js在用户点击的时候将按钮disabled掉,但是这样并不是很可靠(我就可以跳过这个,用一个for循环 我直接自己post数据过去)

2、在生成客服端html的时候存放一个隐藏的input,input里面存放一个随机生成的值(一般为guid),服务器端会将此值保存,等用户提交的时候 判断提交过来的guid是否匹配(这种方法相对第一种安全性更高,但是如果是全静态的页面的话就不满足了,于是自己琢磨了第3中解决方案)

3、通过自定义ActionFilter来实现,代码如下

public class PreventMutipleSubmitAttribute:ActionFilterAttribute
{
private int delaySecond =5;
/// <summary>
/// 重复提交的时间秒(两次间隔不大于改值时视为重复提交),默认为5s
/// </summary>
public int DelaySecond
{
get { return delaySecond; }
set { delaySecond = value; }
} public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var request=filterContext.RequestContext.HttpContext.Request;
var cache = filterContext.RequestContext.HttpContext.Cache; var paramModel = filterContext.ActionParameters;
paramModel.Add("userID", ApplicationPrincipal.CurrentPrincipal.UserID);
paramModel.Add("userIP", request.UserHostAddress);
var clientPostModel = JsonConvert.SerializeObject(paramModel); var md5Model = MD5.Create().ComputeHash(Encoding.ASCII.GetBytes(clientPostModel)).Select(s => s.ToString("x2"));
var hashValue = string.Join("", md5Model);
if (cache[hashValue] == null)
{
cache.Add(hashValue, "", null, DateTime.Now.AddSeconds(delaySecond), Cache.NoSlidingExpiration, CacheItemPriority.Default, null);
base.OnActionExecuting(filterContext);
}
else {
filterContext.Result = new MutipleSubmitException();
}
}
}

 跟权限过滤器一样,在需要防止多次提交的地方打上这个标签就ok啦。

解释下实现的思路:主要是将用户提交过来的参数+用户IP+用户主键ID 然后得到这些值的md5,将得到的md5值存放在缓存中(只存了5秒,根据实际情况可以适当增加),当用户提交过来的时候判断缓存中是否与这个键,如果有就是重复提交的,在else里面做相应的处理就可以了,我这里的MutipleSubmitException是自定义的一个异常状态码,你也可以自己定义返回json什么的都可以,配合前端的处理就跟完美了。ok 到此,服务器端防止多次提交完毕!如有bug谢谢网友反馈...

mvc 防止客服端多次提交的更多相关文章

  1. 浏览器与服务器间的交互(客服端 <---> 服务器)

    浏览器与服务器间的交互(客服端 <---> 服务器) 请求--->处理--->响应 对类HttpContext 内部成员的使用 例如 :Request .Response .  ...

  2. python服务器端、客户端的模型,客服端发送请求,服务端进行响应(web.py)

    服务器端.客户端的模型,客服端发送的请求,服务端的响应 相当于启动了一个web server install web.py 接口框架用到的包 http://webpy.org/tutorial3.zh ...

  3. C# 向服务器上传文件(客服端winform、服务端web)

    转载 首先写客服端,winform模拟一个post提交: /// <summary> /// 将本地文件上传到指定的服务器(HttpWebRequest方法) /// </summa ...

  4. TCP服务器端和客服端(一)

    就是一个客服端(Socket)和服务器(ServerSocket)端的链接间.我的理解是一个服务端可以链接多个客服端. 在客服端有输入流outPutStream. 用于发送数据 在服务器端有输出流.i ...

  5. Live555 分析(三):客服端

    live555的客服端流程:建立任务计划对象--建立环境对象--处理用户输入的参数(RTSP地址)--创建RTSPClient实例--发出DESCRIBE--发出SETUP--发出PLAY--进入Lo ...

  6. Spring Cloud 客服端负载均衡 Ribbon

    一.简介   Spring Cloud Ribbon 是一个基于Http和TCP的客服端负载均衡工具,它是基于Netflix Ribbon实现的.它不像服务注册中心.配置中心.API网关那样独立部署, ...

  7. 四:客服端防护HTTP发送请求类

    一.源代码: public class swtDefendOperate{private BackgroundWorker backgroundWorker;//DefendType的值 Verify ...

  8. android客服端+eps8266+单片机+路由器之远程控制系统

    用android客服端+eps8266+单片机+路由器做了一个远程控制的系统,因为自己是在实验室里,所以把实验室的门,灯做成了远程控制的. 控制距离有多远------只能说很远很远,只要你手机能上网的 ...

  9. jetty 客服端 与服务端

    jetty 服务端,客服端有请求buffter 检查 默认4kb 4096 客服端 HttpClient client=new HttpClient(); client.setRequestBuffe ...

随机推荐

  1. 【转】IOS开发小技巧

    1,Search Bar 怎样去掉背景的颜色(storyboard里只能设置background颜色,可是发现clear Color无法使用). 其实在代码里还是可以设置的,那就是删除背景view [ ...

  2. FIDO联盟:我们将杀死密码

    前不久发布的三星S5与iPhone 5S一样,配备了指纹识别技术.但更为重要的是,这一识别器可以与PayPal关连,进而与多种支付系统相连.通过这一过程,你很可能会摆脱密码,用指纹就可以畅游网络.当然 ...

  3. 链表-Add Two Numbers

    第一版代码(很挫很罗嗦,不过是第一次做,记录一下成长的脚步!继续努力!) /*struct ListNode { int val; struct ListNode *next; };*/ typede ...

  4. Ubuntu 13.04 小米2S连接Eclipse真机调试

    最近想继续将自己以前的一些Android程序代码进行改进和优化,遂将以前的代码在windows下导入eclipse工程,谁知导入后便eclipse假死,甚至windows资源管理器也动弹不得,诡异的是 ...

  5. Swift利用闭包(closure)来实现传值-->前后两个控制器的反向传值

    一.第一个界面 // Created by 秦志伟 on 14-6-13. import UIKit class ZWRootViewController: UIViewController { in ...

  6. linux 使用sudo开放普通用户权限

    整理一下以前写的东东,刚才又忘了- ---------------------------------------------------------------------------------- ...

  7. jquery 点击按钮实现listbox的显示与隐藏,点击其他地方按钮外的地方,隐藏listbox

    本来不知道如何获取服务器的控件的,这下知道可以这么做了,所以记录下来.... <asp:ImageButton ID="alltime" ImageUrl="ima ...

  8. 微信小程序环境搭建

    第一步  IDE下载 Win版链接: https://pan.baidu.com/s/1gfAy18n 第二步 破解 最新下载链接: https://pan.baidu.com/s/1gfAy18n ...

  9. sql大数据量查询的优化技巧

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  10. LDAP验证用户名和密码

    测试环境:VS2008, NET Framework 3.5 公司打算改用LDAP来存储用户名和密码,现在用C#测试下如何能拿到LDAP中的用户名,并检测用户密码是否正确.即输入用户名和密码,可以检验 ...