但凡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. Distributed Machine Learning Toolkit

    http://www.dmtk.io http://www.dmtk.io/download.html

  2. asp.net core + angular2

    asp.net core + angular2 的环境配置 国内整个对 asp.net core  和 angular2这些新出来的关注度不是太好.跟国外比很大差距. 我在试着去做这个整合的时候也碰到 ...

  3. PHP之MVC微型框架简单搭建

    好长时间没有写博客了,这段时间过得紧张的不行,以致于都没有抽出时间来好好的总结一下自己这段时间的生活和学习. 其实今天不想写什么技术博客,就想简单总结一下这段时间的生活.10月8号从家里回来以后决定自 ...

  4. android LinearLayout android:layout_weight 作用,固定比例

    android 中的 LinearLayout  是线性布局有水平布局horizontal  垂直布局vertical .本文针对 水平布局horizontal 布局的weight属性做一个标记,以免 ...

  5. Oracle EBS-SQL (SYS-10):锁定表查询.sql

    /*死锁查询-1*/ SELECT o.object_name, l.session_id,l.process, l.locked_mode FROM v$locked_object l , dba_ ...

  6. java 操作配置文件 .properties

    package com.dms.common; import java.io.File; import java.io.FileInputStream; import java.io.FileNotF ...

  7. TraceView简单使用方法

    一.TraceView简介 TraceView是AndroidSDK里面自带的工具,用于对Android的应用程序以及Framework层的代码进行性能分析. TraceView是图形化的工具,最终它 ...

  8. 梯度下降算法的一点认识(Ng第一课)

    昨天开始看Ng教授的机器学习课,发现果然是不错的课程,一口气看到第二课. 第一课 没有什么新知识,就是机器学习的概况吧. 第二课 出现了一些听不太懂的概念.其实这堂课主要就讲了一个算法,梯度下降算法. ...

  9. javascript 中 keyup、keypress和keydown事件

    keyup.keypress和keydown事件都是有关于键盘的事件 1. keydown事件在键盘的键被按下的时候触发,keyup 事件在按键被释放的时候触发    keydown.keypress ...

  10. .Net C# ASP.Net和ADO.Net

    1.NET是一个平台,一个抽象的平台的概念. .NET平台其本身实现的方式其实还是库,抽象层面上来看是一个平台. .NET Framework包括两个关键组成元素: a.Common Language ...