Caching 如何防止表单字段在单击“上一步”按钮后重新填充?

Caching 如何防止表单字段在单击“上一步”按钮后重新填充?,caching,browser,coldfusion,Caching,Browser,Coldfusion,我有一个简单的表单,它有四个字段,分别是firstName、lastName、address和phone number 在用户填写此表单并单击提交按钮后,如果一切正常,我会将该用户重定向到成功页面 但在成功页面中单击浏览器后退按钮时,表单字段值将重新填充到表单上。我怎样才能防止这种情况发生 我已经尝试了以下代码: <cfheader name="cache-control" value="no-cache, no-store, must-revalidate"> <cfhea

我有一个简单的表单,它有四个字段,分别是firstName、lastName、address和phone number

在用户填写此表单并单击提交按钮后,如果一切正常,我会将该用户重定向到成功页面

但在成功页面中单击浏览器后退按钮时,表单字段值将重新填充到表单上。我怎样才能防止这种情况发生

我已经尝试了以下代码:

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


但是它不起作用。

重新填充表单字段是一件好事,不要试图破坏它

如果您真正想要的是防止重复提交,请将唯一id(例如UUID)与表单一起发送,并跟踪您最近收到的id(跟踪多少取决于您的应用程序)


如果您收到一份副本,您可以忽略它(并显示相应的消息),或者更进一步:检查收到的数据是否已经提交,或者是否试图更改以前提交的数据(即,修复打字错误),或者创建新记录(可能更改了firstname和phone),或者提示用户进行选择,或者其他任何操作。

重新填充表单字段是一个不错的选择,我知道,但是我们可以使用
autocomplete=“off”

当我运行它时,它会工作。首先,文件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标记。

autocomplete=off在您作为用户时非常烦人。
autocomplete
属性用于在您第一次访问页面时预填写表单(基于您以前填写类似表单的方式),而不是在单击“后退”按钮时。是的,我知道,但它也适用于我的所有浏览器。chrome和firefox有一个
autocomplete=“on”
扩展,可以轻松覆盖这个“修复”,我只对登录表单和信用卡信息使用autocomplete=“off”。一些PCI合规性评估需要它。我完全同意。最大的问题是“我的最终目标是什么?”如果你只是想阻止人们重新提交表格,Peter的建议是一个好办法。如果你想阻止人们返回表单,那么你可能会问自己为什么。使用“后退”按钮更新表单可能是不可取的,但从用户的角度来看,这并不是不合理的。如果你不想重复提交,你应该在表单提交中检查这一点。从个人经验来看,重新编程正常的浏览器行为真的很糟糕。