我正在做网络开发。
我有一个与信用卡有关的页面,当用户单击“刷新”或“返回”时,交易将再执行一次,这是不需要的。
这包括浏览器左上角的“返回”和“刷新”按钮,“右键单击->刷新/返回”,按“F5”键。这只能在某些 cgi 页面上完成,而不是全部。
这可以使用Javascript来完成吗?还是有什么其他方法?
我正在做网络开发。
我有一个与信用卡有关的页面,当用户单击“刷新”或“返回”时,交易将再执行一次,这是不需要的。
这包括浏览器左上角的“返回”和“刷新”按钮,“右键单击->刷新/返回”,按“F5”键。这只能在某些 cgi 页面上完成,而不是全部。
这可以使用Javascript来完成吗?还是有什么其他方法?
标准方法是分 3 步完成。
这打破了基本的浏览器用户体验模型......用户应该始终能够在他们的浏览器中使用刷新和返回按钮。建议您以另一种方式修复您的页面。
如果您更新您的问题以包含您正在使用的服务器语言/平台/技术,那么有人可能会提出解决方案。
重新提交表单会产生重复交易这一简单事实令人担忧。您应该进行某种检查以确保每次提交的表单数据都是唯一的。
例如,提交表单的页面应该被赋予一个与表单一起提交的唯一 ID。然后业务逻辑应该能够识别出提交的表单已经被处理(因为(不再)唯一 ID 将是相同的),因此忽略第二次尝试。
“标准方式”仍然不会阻止客户两次单击后退按钮......甚至如果他们不认为(无论出于何种原因)它已被处理,则返回并重新提交表单。
生成一个随机字符串并将其存储在会话中,
然后将其作为隐藏值输出到您的表单中,
检查提交和存储变量,如果匹配处理您的请求,
转到 1。
将此代码放在表单页面上
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetExpires(DateTime.Now-new TimeSpan(1,0,0));
Response.Cache.SetLastModified(DateTime.Now);
Response.Cache.SetAllowResponseInBrowserHistory(false);
您不应该尝试“阻止”这些操作。您应该做的是确保当有人“双重提交”表单时不会发生任何事情。
在某些浏览器中你甚至不能这样做,这很好!
最好的方法是拥有足够的会话处理逻辑,您可以将第二次(及以后)尝试识别为“这只是重新提交”并忽略它。
我没有在这里看到这个,所以在这里。
如果未找到会话变量,则不会处理该表单。由于该变量一经发现就被删除,因此只能通过按下提交按钮来运行该表单。刷新和返回不会提交表单。这将在不使用重定向的情况下工作。
我发现上面的 Post/Redirect/Get 解释有点模棱两可
这是我所遵循的,希望它对将来的人有所帮助
http://wordsideasandthings.blogspot.ca/2013/04/post-redirect-get-pattern-in-php.html
基本上基于上述解决方案的过程是:
使用以下内容重定向:
header("HTTP/1.1 303 See Other");
header("Location: http://$_SERVER[HTTP_HOST]/yourfilehere.php");
die();
标头重定向将在“yourfilehere.php”上发起GET
请求,因为重定向只是从服务器获取数据的“请求”,而不是向POST
服务器提交数据的“请求”。因此,重定向/GET
防止在刷新后发生任何进一步的 DB/支付处理。错误状态将301
有助于按下后退按钮。
有用的阅读:
vartec:s 解决方案解决了重新加载问题,而不是返回问题,所以这里有一个解决方案:
然后如果用户按下返回按钮,处理页面将不再进行处理,只会重定向到处理页面。
只需将此javascript放在头部分上方的aspx页面的html部分
<script type = "text/javascript" >
function disableBackButton()
{
window.history.forward();
}
setTimeout("disableBackButton()", 0);
</script>
我们需要把它放在我们想要阻止用户通过点击后退按钮访问的页面的 html 部分
页面的完整代码如下所示
<%@ Page Language="C#" AutoEventWireup="true"
CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!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 runat="server">
<title>Untitled Page</title>
<script type = "text/javascript" >
function disableBackButton()
{
window.history.forward();
}
setTimeout("disableBackButton()", 0);
</script>
</head>
<body onload="disableBackButton()">
<form id="form1" runat="server">
<div>
This is First page <br />
<br />
Go to Second page
<br />
<br />
<asp:LinkButton ID="LinkButton1" runat="server"
PostBackUrl="~/Default2.aspx">Go to Second Page
</asp:LinkButton></div>
</form>
</body>
</html>
如果您使用的是 firefox,请使用而不是 onload
如果要使用 aspx 页面后面的代码禁用后退按钮,则需要在后面编写下面提到的代码 C# 代码
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
string strDisAbleBackButton;
strDisAbleBackButton = "<script language="javascript">\n";
strDisAbleBackButton += "window.history.forward(1);\n";
strDisAbleBackButton += "\n</script>";
ClientScript.RegisterClientScriptBlock(this.Page.GetType(), "clientScript", strDisAbleBackButton);
}
我们也可以通过在 Page_load 事件或 Page_Init 事件中编写这行代码来禁用浏览器缓存或缓存来实现这一点
protected void Page_Init(object Sender, EventArgs e)
{
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetExpires(DateTime.Now.AddSeconds(-1));
Response.Cache.SetNoStore();
}
这样做,用户将在点击浏览器的返回按钮时收到页面已过期消息
演示是:
此代码适用于不从当前页面返回我..
在这里,我放了一个可以帮助您的代码,而不是打开上下文菜单,并且在浏览器重新加载时询问您是否离开页面...
我正在尝试询问单击浏览器后退按钮
jQuery( document ).ready(function() {
document.onkeydown = fkey;
document.onkeypress = fkey
document.onkeyup = fkey;
var wasPressed = false;
function fkey(e){
e = e || window.event;
//alert(e.keyCode);
if( wasPressed ) return;
if (e.keyCode == 116 || e.keyCode == 8 || e.keyCode == 17) {
// alert("f5 pressed");
window.onbeforeunload = null;
return true;
}
}
window.onbeforeunload = function (event) {
var message = ''; // Type message here
if (typeof event == 'undefined') {
event = window.event;
}
if (event) {
event.returnValue = message;
}
return message;
};
jQuery(function () {
jQuery("a").click(function () {
window.onbeforeunload = null;
});
jQuery(".btn").click(function () {
window.onbeforeunload = null;
});
//Disable part of page
$(document).on("contextmenu",function(e){
return false;
});
});});
谢谢,