十分钟内学会 避免用户刷新导致重复POST提交
程序员文章站
2022-12-18 17:15:04
question 在web应用中,采用post提交信息是非常常见的,然而如果目标页面打开得太慢,用户就可能会刷新页面,这时候之前已经提交过的信息就会被重复提交。即使用户成功...
question
在web应用中,采用post提交信息是非常常见的,然而如果目标页面打开得太慢,用户就可能会刷新页面,这时候之前已经提交过的信息就会被重复提交。即使用户成功打开了post提交目标页,之后他通过链接导航到别处了,再退回到post提交目标页时仍可能会重复提交页面(例如因为浏览器缓存已失效)。而且,只要碰到重复post提交的场景,浏览器就会问用户是否确认重做此操作,用户并不一定能正确理解重做意味着重做什么,浏览器又不允许网站向用户解释清楚,所以这属于非常不友善的设计。那么我们应该如何避免用户刷新带来的重复提交呢?
answer
有一种最简单的模式能够解决这个问题,叫做prg,也就是post-redirect-get。在用户提交信息后,我们不要在post提交的目标url返回结果页面,而返回一个302将浏览器重定向到真正的结果显示页,然后浏览器通过get去获取那个页面。
这样做的话,用户刷新结果页,或者通过历史记录回到该页面,都不会导致浏览器要重新进行post,自然也就不会出现烦人的是否重做对话框了。而对于你来说,也有效避免了用户重复提交信息的可能性。
在web应用中,采用post提交信息是非常常见的,然而如果目标页面打开得太慢,用户就可能会刷新页面,这时候之前已经提交过的信息就会被重复提交。即使用户成功打开了post提交目标页,之后他通过链接导航到别处了,再退回到post提交目标页时仍可能会重复提交页面(例如因为浏览器缓存已失效)。而且,只要碰到重复post提交的场景,浏览器就会问用户是否确认重做此操作,用户并不一定能正确理解重做意味着重做什么,浏览器又不允许网站向用户解释清楚,所以这属于非常不友善的设计。那么我们应该如何避免用户刷新带来的重复提交呢?
answer
有一种最简单的模式能够解决这个问题,叫做prg,也就是post-redirect-get。在用户提交信息后,我们不要在post提交的目标url返回结果页面,而返回一个302将浏览器重定向到真正的结果显示页,然后浏览器通过get去获取那个页面。
这样做的话,用户刷新结果页,或者通过历史记录回到该页面,都不会导致浏览器要重新进行post,自然也就不会出现烦人的是否重做对话框了。而对于你来说,也有效避免了用户重复提交信息的可能性。