Post/Redirect/Get 简称PRG,是一种用来防止表单重复提交数据的一种Web设计模式,典型的重复提交form内容的状况像用户刷新提交响应页面等可经过PRG模式来获得避免。php
当一个表单经过HTTP POST被请求提交的时候,用户在服务器端返回响应期间若是刷新了响应页面,将会致使原始HTTP POST过来的内容重复提交,可能会致使一些不可预期的结果,好比重复提交数据。html
一般咱们能够采用PRG模式来回避重复提交数据问题。PRG模式经过响应页面Header返回HTTP状态码进行页面跳转替代响应页面跳转过程。PRG模式流程以下图示:设计模式
HTTP 1.1 规范介绍HTTP 303U状态页进行跳转,303状态能确保会员在浏览器端安全地刷新服务器端响应,而不会引发HTTP POST请求重复提交。另外,目前不少商业网站依然继续使用HTTP 302来响应跳转,主要考虑到一些版本的浏览器不能很好地兼容HTTP1.1规范中的303状态码。浏览器
HTTP规范摘录:缓存
302 Found安全
请求的资源如今临时从不一样的URI响应请求。因为这样的重定向是临时的,客户端应当继续向原有地址发送之后的请求。只有在Cache-Control或Expires中进行了指定的状况下,这个响应才是可缓存的。服务器
新的临时性的URI应当在响应的Location域中返回。除非这是一个HEAD请求,不然响应的实体中应当包含指向新的URI的超连接及简短说明。app
若是这不是一个GET或者HEAD请求,那么浏览器禁止自动进行重定向,除非获得用户的确认,由于请求的条件可能所以发生变化。oop
注意:虽然RFC 1945和RFC 2068规范不容许客户端在重定向时改变请求的方法,可是不少现存的浏览器将302响应视做为303响应,而且使用GET方式访问在Location中规 定的URI,而无视原先请求的方法。状态码303和307被添加了进来,用以明确服务器期待客户端进行何种反应。post
303 See Other
对应当前请求的响应能够在另外一个URI上被找到,并且客户端应当采用GET的方式访问那个资源。这个方法的存在主要是为了容许由脚本激活的POST 请求输出重定向到一个新的资源。这个新的URI不是原始资源的替代引用。同时,303响应禁止被缓存。固然,第二个请求(重定向)可能被缓存。
新的URI应当在响应的Location域中返回。除非这是一个HEAD请求,不然响应的实体中应当包含指向新的URI的超连接及简短说明。
注意:许多HTTP/1.1版之前的浏览器不能正确理解303状态。若是须要考虑与这些浏览器之间的互动,302状态码应该能够胜任,由于大多数的浏览器处理302响应时的方式偏偏就是上述规范要求客户端处理303响应时应当作的。
值得注意的是,PRG设计模式并不能适用全部的表单重复提交状况,如如下几种状况:
若是用户返回表单页面,从新提交表单的状况
用户在服务器端响应到达以前,屡次点击提交按钮的时候。(可经过JavaScript控制提交按钮点击次数)
因为服务器响应缓慢,用户刷新提交POST请求形成的屡次POST请求
恶意用户避开客户端预防屡次提交手段,进行重复提交请求
除了PRG设计模式外,另外还有一些其余技术被用在防止表单重复提交的状况下,如客户端咱们能够采起JavaScript防止用户屡次点击提交按钮,还能够采用Session记录用户当前提交行为等。
引用:http://en.wikipedia.org/wiki/Post/Redirect/Get