http://discoursedb.org/wiki/Special:RunQuery/Item_query
上面的链接有一个表单,如果您输入搜索项并单击结果中的任何链接,然后单击后退按钮,结果仍然存在。
我有一个相同的表单,其中包含其他字段(下拉列表和复选框),其中后退按钮不起作用,浏览器要求确认再次提交数据。
导致这种情况的原因是什么?
更新: 我刚刚注意到,如果我在Chrome中打开控制台并测试我的实现,它会在禁用缓存时起作用,否则不起作用。也许这有助于解释行为?
答案 0 :(得分:3)
不要从POST结果中返回文档。而是返回重定向到文档。这有助于解决许多这些问题。这也是导致重新提交警告的原因。单击后退时,会跳过重定向的链接,但不会跳过200 OK响应。因此,如果您的回复请求200 OK,那么您可能做错了。使用位置标题中的实际文档URL回复303参见其他或类似内容。
更多细节:
POST请求通常不可缓存。 POST请求用于执行某些操作或添加一些数据。如果再次发出相同的请求,则需要再次执行操作或添加一些新数据。
GET请求通常是可缓存的。 GET请求用于获取资源。当您在特定URL处请求资源时,如果您再次发出相同的请求,通常会要求返回相同的文档。
无论哪种方式,服务器都会使用多个状态代码之一进行响应。最常见的是200 OK,它告诉浏览器一切正常,请求并显示对用户的响应。
下一个最常见的是重定向。有几种变体,但最常见的是301 Moved Permanently(当你将它们发送到规范URL时适用),302 Found(有点全部捕获)和303 See Other(这通常是你想要的)对POST成功的回应)。对于所有这些重定向情况,Location标头将包含浏览器应重定向到的URL。
目前,您正在为POST请求发回200 OK结果。这告诉浏览器应该向用户显示响应。但由于它是POST请求,浏览器不会缓存响应。并且您将获得表单重新提交警告,因为为了刷新页面,您必须重新发送POST请求及其所有数据。
应该发生的是POST请求以303 See Other和位于响应文档的Location头中的URL进行响应。当浏览器看到重定向时,它将针对此URL发出GET请求,该请求是可缓存的,并且在您尝试刷新时不会导致表单重新提交问题。
您可能需要阅读以下内容以获取更多背景信息。
答案 1 :(得分:0)
这是因为您的服务器已禁用缓存。这是一个老帖子,但问题仍然存在。无论您是使用页面还是重定向来回复您的POST,如果您已禁用缓存,Chrome仍将阻止后退按钮,这意味着支持表单POST。在其他浏览器中,他们只需返回历史记录并返回最后一个GET请求,忽略POST /表单提交。对于Chrome,它没有。您只需重新启用缓存即可尝试,Chrome会从您的POST请求中返回缓存响应。 Chrome会缓存帖子回复(请参阅附件中的图片),但前提是您已将其允许。
如何启用/禁用缓存
这是另一个主题,但它通过从服务器端发送指示客户端不缓存响应的标头来最一致地完成。简单地在HTML中将标题添加到元标记中并不是在所有情况下都有效,但这是一个可能会尝试"防止缓存。 Java开发人员的一个示例,可以移植到其他语言。 Java servlet how to disable caching of page