如何防止在点击返回按钮后表单字段重新填充?

6

我有一个简单的表单,其中包含四个字段:firstName(名字)、lastName(姓氏)、address(地址)和phoneNumber(电话号码)。

当用户填写完这个表单并点击提交按钮后,如果一切顺利,我会将该用户重定向到成功页面。

但是,从成功页面点击浏览器的“返回”按钮时,表单字段值会重新填充在表单中。如何防止这种情况发生?

我已经尝试了以下代码:

<cfheader name="cache-control"  value="no-cache, no-store, must-revalidate">
<cfheader name="pragma" value="no-cache">
<cfheader name="expires" value="#getHttpTimeString(now()-1)#">

但是它没有起作用。

3个回答

6
重新填写表单字段是一件好事情,请不要试图破坏它。
如果您想要防止重复提交,可以随表单一起发送唯一的 ID(例如 UUID),并跟踪最近收到过的 ID 数量(跟踪数量取决于您的应用程序)。
如果您收到了一个重复的 ID,您可以忽略它(并显示适当的消息),或者更进一步:检查接收到的数据是否已经被提交过,或者它是试图更正先前提交的内容(即纠正拼写错误),还是创建一个新记录(也许修改了名字和电话号码等信息),或者提示用户选择等等。

4
我完全同意。最重要的问题是“我在这个问题上的终极目标是什么?”如果你只想防止人们重新提交表单,Peter的建议是一个不错的方法。如果你想防止人们回到表单页面,那么你需要问问自己为什么。从用户的角度来看,使用浏览器的返回按钮更新表单可能并不理想,但也不是不合理的。如果你不想让表单出现重复提交,你应该在表单提交时进行检查。根据个人经验,重新编写普通浏览器行为真的很麻烦。 - Shawn
2
有很多情况下,您不希望重新填充字段。 - PunyFlash

6
重新填充表单字段是一个好的功能,但我们可以通过使用autocomplete="off"来禁用它。

4
关闭自动填充功能(autocomplete=off)会让用户感到非常烦恼。 - Dan Bracuk
3
autocomplete 属性用于在首次访问页面时根据您之前填写类似表单的方式进行预填充,而不是在单击后退按钮时预填充。 - Miguel-F
是的,我知道,但它在我的情况下在所有浏览器中都有效。 - Deepak Kumar Padhy
1
有一个 Chrome 和 Firefox 的 autocomplete="on" 扩展,可以轻松地覆盖这个“修复”操作。 - Matt Busche
1
我只在登录表单和信用卡信息中使用autocomplete="off"。一些PCI合规性评估要求这样做。 - Scott Jibben
显示剩余2条评论

0

这在我运行时是有效的。首先,文件testform.cfm。

<cfsetting showdebugoutput="no">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0    
Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<CFHEADER NAME="Cache-Control" VALUE="no-cache, no-store, must-revalidate">
<!--- this is meant for legacy HTTP 1.0 servers 
- only prevents caching when used with secure communications (https://)  --->
<CFHEADER NAME="Pragma" VALUE="no-cache">
<!--- this doesn't prevent caching, 
just means for future requests that browser must contact server for fresh copy. 
cached copy used for BACK and FORWARD buttons--->
<CFHEADER NAME="Expires" VALUE="-1">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Untitled Document</title>
</head>

<body>
<form action="formtarget.cfm" method="post">
<input type="text" name="x" value="" />
<input name="submitbutton" type="submit" />
</form>
</body>
</html>

这是formtarget.cfm文件

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0   
Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Untitled Document</title>
</head>
<body>
<cfdump var="#form#">
</body>
</html>

我们在自定义标签中有这三个cfheader标记。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接