安全操作,幂等操作

转载 2016年08月29日 14:44:59

转自 http://blog.sina.com.cn/s/blog_4fd9844201010j0b.html

PUT,DELETE操作是幂等的。所谓幂等是指不管进行多少次操作,结果都一样。比如我用PUT修改一篇文章,然后在做同样的操作,每次操作后的结果并没有不同,DELETE也是一样。顺便说一句,因为GET操作是安全的,所以它自然也是幂等的。 


POST操作既不是安全的,也不是幂等的,比如常见的POST重复加载问题:当我们多次发出同样的POST请求后,其结果是创建出了若干的资源。 

安全和幂等的意义在于:当操作没有达到预期的目标时,我们可以不停的重试,而不会对资源产生副作用。从这个意义上说,POST操作往往是有害的,但很多时候我们还是不得不使用它。 

还有一点需要注意的就是,创建操作可以使用POST,也可以使用PUT,区别在于POST是作用在一个集合资源之上的(/articles),而PUT操作是作用在一个具体资源之上的(/articles/123),再通俗点说,如果URL可以在客户端确定,那么就使用PUT,如果是在服务端确定,那么就使用POST,比如说很多资源使用数据库自增主键作为标识信息,而创建的资源的标识信息到底是什么只能由服务端提供,这个时候就必须使用POST。 

一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等操作对于代理和缓存来说具有“友好性”,因为幂等操作的额外执行不会对二者产生危害性后果(除了带宽浪费)。 
PUT方法是幂等的,幂等性意味着对于一个成功执行的请求,不管其执行多少次,其结果都是一致的。也就是说,只要你愿意,你可以用PUT方法对Hotel资源进行任意次更新,其结果都一样。如果两个PUT方法同时发生,那么只有其中之一会赢得最后的胜利并决定资源的最终状态。删除操作也是幂等的,如果一个PUT方法和DELETE方法同时发生,那么资源或者被更新,或者被删除,而不可能停留在某个中间状态。 

如果你不确定是PUT还是DELETE被成功执行,并且没有得到状态码409 (Conflict)或者 417 (ExpectationFailed)的话,那么就重新执行一遍。而不需要附加的可靠性协议来避免重复请求,因为通常重复的请求不会有任何影响。 

上述描述对于POST方法就不适用了,因为POST方法不是幂等的,若要两次执行同一个POST请求那就要注意了。POST方法所缺失的幂等性就解释了为什么当你每次重新发送POST请求时浏览器总是弹出警告。POST方法用于创建资源,而不需要由客户端指定实例id 

幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。例如,“getUsername()”函数就是一个幂等函数,“deleteFile()”函数就不是。“幂等”是HTTPSession和EJB失败转移中的一个重要概念。 
当正在进行方法调用的时候失败了怎么办呢?答案是:处理过程中止,客户端看见错误消息提示(除非方法是幂等方法)。只有方法是幂等方法的情况,一些负载均衡器才能试图失败转移这些方法到别的实例。 

幂等为何如此重要?因为客户端并不知道服务器何时失败的(在方法刚开始调用或者快要调用完成的时候)。如果是非幂等方法,则两次调用就会两次改变系统状态,系统就会处于不一致的状态。 

在复杂应用中,不太可能把所有的方法都变成幂等方法。所以,只能通过失败转移减少错误,而不可能从根本上避免错误。 

把应用程序设计为幂等的:幂等的的意思就是一个操做不会修改状态信息,并且每次操作的时候都返回同样的结果(换句话说就是:做多次和做一次的效果是一样的),通常,WEB请求,特别是HTML forms 都被发送多次(当用户点击发送按纽两次,重载页面多次),导致多次HTTP请求。设计SERVLET和其他WEB对象为幂等的,可以容忍多次请求。详细可以去参考设计模式“Synchronized Token ”和“Idempotent Receiver”关于怎样设计幂等的的应用程序。

相关阅读(推荐):http://www.cnblogs.com/weidagang2046/archive/2011/06/04/2063696.html

什么是幂等操作(http,xcap)

什么是幂等操作? 下面是在网络上收集的结果,主要是从网络协议方面来解释的 1. 幂等的意味着对同一URL的多个请求应该返回同样的结果。这里我再解释一下幂等这个概念:幂等(idempotent、idem...
  • xymyeah
  • xymyeah
  • 2009年04月05日 00:16
  • 12421

何为幂等可重试(安全操作)

google了一些中文的资料, 基本了解了幂等是怎么回事儿. 备忘一下.  PUT,DELETE操作是幂等的。所谓幂等是指不管进行多少次操作,结果都一样。比如我用PUT修改一篇文章,然后在做同样...
  • caisini_vc
  • caisini_vc
  • 2016年03月21日 19:42
  • 815

程序函数设计的幂等性

1.幂等性        一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等操作对于代理和缓存来说具有“友好性”,因为幂等操作的额外执行不会对二者产生危害性后果(除了带宽浪费)...
  • wangjianno2
  • wangjianno2
  • 2015年06月23日 00:16
  • 650

Java幂等

基于HTTP协议的Web API是时下最为流行的一种分布式服务提供方式。无论是在大型互联网应用还是企业级架构中,我们都见到了越来越多的SOA或RESTful的Web API。为什么Web API如此流...
  • dlgdlg_2008
  • dlgdlg_2008
  • 2017年04月17日 20:26
  • 379

幂等、分布式锁

前台操作去抖动和防快速操作的措施,我们首先会想到在前端做一层控制。当前端触发操作时,或弹出确认界面,或disable入口并倒计时等等。但前端的限制仅能解决少部分问题,且不够彻底,后端自有的防重复处理措...
  • sinat_37138973
  • sinat_37138973
  • 2017年06月28日 17:06
  • 486

高并发的核心技术-幂等的实现方案

高并发的核心技术-幂等的实现方案  一、背景  我们实际系统中有很多操作,是不管做多少次,都应该产生一样的效果或返回一样的结果。  例如:  1. 前端重复提交选中的数据,应该后台只产...
  • rdhj5566
  • rdhj5566
  • 2016年02月09日 12:11
  • 8417

分布式处理 幂等设计

最近做的项目的性能调优中关于幂等设计的一些总结 场景:假设有这样一个方法,保护了一些DB操作,check if existing then update else save. 如果两个线程同时去执行这...
  • nokiaisacat
  • nokiaisacat
  • 2016年04月19日 16:28
  • 1706

高并发实战之幂等处理

高并发实战之幂等处理 一、背景 1. 前端重复提交选中的数据,应该后台只产生对应这个数据的一个反应结果。 2. 我们发起一笔付款请求,应该只扣用户账户一次钱,当遇到网络重发或系统bug重发,...
  • u010412301
  • u010412301
  • 2017年06月02日 11:52
  • 433

幂等和高并发在电商系统中的使用

在Java web项目开发中,经常会听到在做订单系统中生成订单的时候,要做幂等性控制和并发控制,特对此部分内容作出总结,在高并发场景下,代码层面需要实现并发控制;但是幂等性,其实更多的是系统的接口对外...
  • dhfzhishi
  • dhfzhishi
  • 2017年12月20日 22:46
  • 78

HTTP幂等性及注意事项

幂等性——是系统的接口对外一种承诺(而不是实现),承诺只要调用接口成功,外部多次调用对系统的影响是一致的。 转知乎(Ivony)一个回答: 一个幂等的操作典型如: 把编号为5的记录的A字...
  • soonfly
  • soonfly
  • 2016年10月12日 09:58
  • 1237
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:安全操作,幂等操作
举报原因:
原因补充:

(最多只允许输入30个字)