我在旧版本中知道这一点,但我无法弄清楚处理后退按钮的最佳做法。
我正在编写一个Web应用程序,在浏览器和后端服务器之间有大量数据移动。我目前使用post,当然当用户绕过应用程序导航并使用后退按钮IE和Firefox弹出消息询问用户是否要重新发送数据。
我尝试了“get”,除了URL中显示的所有数据外,IE8仍会生成一条消息。
此外,我无法确定帖子何时会显示消息,何时不能确定消息,因为我在测试用例中发布了后退按钮不会导致消息的数据。
我的环境是JavaScript,PHP和MySQL。
非常感谢任何有关研究地点的帮助或指针。
编辑:
我写了3个小页来测试发布a-> b-> c-> a并且它们不会导致任何postdata消息。我不知道为什么:
A
<!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=utf-8" />
<title>test post A</title>
</head>
<body>
<h1>testPostA.php</h1>
<h3>Came from <?php print (isset($_POST['data'])?$_POST['data']:"NoWhere"); ?></h3>
<form action="testPostB.php" method="post">
<input name="data" type="text" value="from testPostA.php" />
<input type="Submit" value="Submit To: testPostB.php" />
</form>
</body>
</html>
乙
<!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=utf-8" />
<title>test post B</title>
</head>
<body>
<h1>testPostB.php</h1>
<h3>Came from <?php print (isset($_POST['data'])?$_POST['data']:"No where"); ?></h3>
<form action="testPostC.php" method="post">
<input name="data" type="text" value="from testPostB.php" />
<input type="Submit" value="Submit To: testPostC.php" />
</form>
</body>
</html>
C
<!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=utf-8" />
<title>test post C</title>
</head>
<body>
<h1>testPostC.php</h1>
<h3>Came from <?php print (isset($_POST['data'])?$_POST['data']:"No where"); ?></h3>
<form action="testPostA.php" method="post">
<input name="data" type="text" value="from testPostC.php" />
<input type="Submit" value="Submit To: testPostA.php" />
</form>
</body>
</html>
答案 0 :(得分:5)
Post/Redirect/Get模式将阻止重新发布警告。但是,您仍然需要注意您的应用程序可以处理/拒绝重复的表单提交等。
修改1
对于Javascript很重的应用程序,我也看到一些设计模式利用browser history和fragment identifiers来提供与后退按钮,书签等更加无缝的集成。
修改2
关于你问题的附录,很难说。可能是在某些情况下浏览器将页面缓存,并且不需要重新提交POST以再次呈现页面。您可以使用各种方法来禁用这些请求上的浏览器缓存,以查看是否可以使行为更具可预测性(即始终导致重新提交警告)。无论如何,我认为遵循发布/重定向/获取模式的网络应用程序更加用户友好,但您的里程可能会有所不同。
要记住的另一件事是你可以在执行查询,生成报告等的表单上使用method =“get”。有时GET在这些只读方案中是更好的选择,因为它使你的URL方案更丰富并避免这些POST警告。
答案 1 :(得分:3)
您可以使用ajax发布数据,然后在响应回来时将其重定向到您想要的任何页面。
答案 2 :(得分:2)
当他们尝试导航到的页面首次从POST表单提交导航到时,将显示用户提示重新提交数据。如果您进行任何类型的AJAX POST,则如果用户向后或向前导航,则不会显示重新提交提示。
为避免收到此提示,您可以使用AJAX或POST然后重定向。但是,这是许多Web应用程序(例如亚马逊的购物车)的行为。我并不完全了解您的应用程序的上下文或行为,但我并不完全相信这是一个您需要担心的问题,特别是如果您不允许重复数据。