Post/Redirect/Get pattern

原创 2010年09月01日 00:02:00

今天重新认识了Post/Redirect/Get pattern, 感谢hip-hop的session, 一下帮助我理清了概念和思路.

 

谈到pattern,首先要清楚它为了什么而产生: PRG (参见链接1)是为了解决web页面的double submit问题而提供的一种方案.

 

1. double submit problem

 

上下文: 用户在browser中的pageA页面完成输入,点击了提交按钮,进入pageB页面,提示"提交成功". 这时, 若分别出现下列三种case:

    1> 重新载入或刷新pageB;

    2> 点击浏览器的后退按钮,接着点击前进按钮;

    3> 点击浏览器的后退按钮退回到pageA,再点一回提交按钮;

对于没有考虑过这种问题而直接开发的网站,会出现什么情况呢?

 

case 1和case 2会由浏览器弹出一个小窗口,提示大意如"可能重复提交页面,是否继续?"的询问,如果选择了yes,那么前面的提交行为会再做一次;而case 3属于你主动地再一次提交. 也就是说,如果是买东西的话,那你已经重复买到了第二份! 这就是所谓的double submit.

 

究起实质, 是由于submit pageA和点击提交按钮共用了同一个服务器请求, 而这恰恰是一个POST请求, 在页面被重复提交的背后, POST请求也被多次发送, 导致server上错误地多次执行了添加或更改数据的行为. 图1解释了double submit问题.

DoubleSubmitProblem.png

                                                                图 1 Double Submit Problem

2. PRG solusion

 

应该想到,用户的这类如"后退再前进"或刷新的行为, 应当视为对历史结果或页面的查看, 并无再次提交之意.

 

解决问题的一种思路就是将用户点击提交按钮从而发出POST请求, 页面提交跳转和显示结果页面这三个行为分离开. PRG正是遵循这种思路, Client用POST方法请求Server响应数据变更, Server用Redirect方法将response指定到另一个URL上的结果页面, Client所有对页面显示的请求都用GET方法告知Server. 解决方案如图2所示. 这样, "后退再前进"或刷新页面的行为都发出的是GET请求, 从而不会对server产生任何数据更改的影响, double submit problem得以解决.

DoubleSubmitSolution.png

                                                                   图2  PRG solusion

 

Basic principles:

* 不要用一个页面直接作为POST请求的响应结果, 你会给习惯"后退再前进"的人留下resubmit难题.

* 在处理完POST请求之后, redirect到另一个URL页面, 刷新页面的人就只能看到它.

* 用GET而不是POST去请求一个页面的显示, 当你需要的仅仅是显示的结果.

 

请注意:

* 后退到页面内再点击提交按钮来提交页面的行为,依然被认为是用户自愿的提交.

* 第一次提交后, Server的response正常完成之前的再次提交若未被所应用的框架阻止的话, 它会被Server认为是另一个正常提交.

 

 

3. IsPostBack

 

值得一提的是, .Net WebForm中, 常在Page_Load方法中使用Page.IsPostBack属性来判断对当前Form的请求是第一次or非第一次, 这和本文讨论的问题不完全一致: Asp.net提供了支持服务器端事件的控件, 同时还支持控件的AutoPostBack行为, 故会多次发出对当前Form的请求, 而IsPostBack提供了加载页面时的一个逻辑分支. IsPostBack属性在多种情况下的取值规则可参见链接2 .

 

附参考链接:

[1]  http://en.wikipedia.org/wiki/Post/Redirect/Get

[2]  http://www.cnblogs.com/hobe/archive/2008/04/06/1139031.html

Web开发设计模式PRG:Post/Redirect/Get,防止重复提交表单

Post/Redirect/Get 简称PRG,是一种用来防止表单重复提交数据的一种Web设计模式,典型的重复提交form内容的情况像用户刷新提交响应页面等可通过PRG模式来得到避免。 当一个表...
  • mudalu626
  • mudalu626
  • 2012年03月22日 17:08
  • 5258

web请求之get,post,forward,redirect

1,form表单:post,get,客户端主动跳转,url地址会改变为提交后的地址 2,forward:forward转发请求,不转发地址,服务器直接访问目标地址,把目标地址响应内容读取过来,然后再发...
  • tidu2chengfo
  • tidu2chengfo
  • 2017年06月27日 16:40
  • 676

Post/Redirect/Get pattern

http://blog.csdn.net/shaobo_wu/article/details/5854448 今天重新认识了Post/Redirect/Get pattern, 感谢hi...
  • hshl1214
  • hshl1214
  • 2015年06月25日 15:00
  • 873

SpringMVC使用RedirectView进行POST重定向

SpringMVC提供一个优雅的后台重定向方式:RedirectView 在需要封装数据,并进行重定向的场景使用它在适合不过了;     /**        * 请求进行重定向 ...
  • WJshanggan
  • WJshanggan
  • 2015年04月17日 10:49
  • 9066

ASP.NET MVC - 使用Post, Redirect, Get (PRG)模式

ASP.NET MVC - 使用Post, Redirect, Get (PRG)模式 原文地址:ASP.NET MVC - Using Post, Redirect, Get Pattern 原文...
  • nic7968
  • nic7968
  • 2013年12月19日 23:17
  • 1314

posturl 与redirect(即重定向)的区别

posturl public class PostURLAction{        public void search() { render("search/search.jsp"); }...
  • Ideality_hunter
  • Ideality_hunter
  • 2016年06月15日 15:22
  • 1916

Post/Redirect/Get pattern for web applications

Post/Redirect/Getpattern for web applicationsPosted by: MichaelJouravlev on ?? 14, 2003 DIGG 原文地址: h...
  • xiaojianpitt
  • xiaojianpitt
  • 2009年02月27日 09:15
  • 1006

JavaWeb学习笔记(三)--- post和get的区别、session和cookie的区别、forward和redirect的区别

1.post与get区别 (1)post是向指定的资源提交要被处理的数据,get是从指定的资源请求数据; (2)查询字符串(名称、值对)的存放位置: POST方式的查询字符串是放在POST请求的...
  • Yolanda_NuoNuo
  • Yolanda_NuoNuo
  • 2016年01月21日 09:12
  • 1480

Spring MVC Flash Attribute 解决POST/Redirect/GET模式问题缺陷

Spring MVC Flash Attribute 解决POST/Redirect/GET模式问题缺陷
  • u010218242
  • u010218242
  • 2015年10月22日 17:27
  • 326

Spring MVC 后台进行post跳转

平时大多数用得还是get跳转,今天遇到一个POST跳转的需求,一下子就蒙圈了。 网上查得用RedirectView跳转,试了半天,总是get跳转,不知道是方法不对是压根就不行。 最后还得用最笨...
  • luxiaoshuai
  • luxiaoshuai
  • 2015年07月02日 20:35
  • 6437
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Post/Redirect/Get pattern
举报原因:
原因补充:

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