私はウェブ開発を行っています。
クレジットカードに関するページがあります。ユーザーが「更新」または「戻る」をクリックすると、トランザクションがもう一度実行されますが、これは望ましくありません。
これには、ブラウザの左上の「戻る」および「更新」ボタン、「右クリック->更新/戻る」、「F5」キーの押下が含まれます。これは、すべてではなく、特定の cgi ページでのみ実行されます。
Javascriptを使用してこれを行うことはできますか? または他の方法はありますか?
私はウェブ開発を行っています。
クレジットカードに関するページがあります。ユーザーが「更新」または「戻る」をクリックすると、トランザクションがもう一度実行されますが、これは望ましくありません。
これには、ブラウザの左上の「戻る」および「更新」ボタン、「右クリック->更新/戻る」、「F5」キーの押下が含まれます。これは、すべてではなく、特定の cgi ページでのみ実行されます。
Javascriptを使用してこれを行うことはできますか? または他の方法はありますか?
標準的な方法は、3 つのステップで行うことです。
これは、基本的なブラウザーのユーザー エクスペリエンス モデルを壊します...ユーザーは常にブラウザーの [更新] ボタンと [戻る] ボタンを使用できる必要があります。ページを別の方法で修正することをお勧めします。
質問を更新して、使用しているサーバー言語/プラットフォーム/テクノロジーを含めると、誰かが解決策を提案できる場合があります。
フォームを再送信するとトランザクションが重複するという単純な事実が心配です。フォームデータの各送信が一意であることを確認するために、何らかのチェックが必要です。
たとえば、フォームを送信するページには、フォームと共に送信される一意の ID を指定する必要があります。その後、ビジネス ロジックは、送信されたフォームが既に処理されていることを認識できる必要があります ((もはや) 一意の ID は同じではないため)。そのため、2 回目の試行は無視されます。
「標準的な方法」でも、クライアントが [戻る] ボタンを 2 回クリックするのを止めることはできません。また、(何らかの理由で) フォームが処理されたと思わない場合は、戻ってフォームを再送信することさえできません。
ランダムな文字列を生成してセッションに保存し、
次に、それを非表示の値としてフォームに出力します。
送信された変数を確認し、一致する場合はリクエストを処理します。
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);
これらのアクションを「ブロック」しようとしないでください。あなたがすべきことは、誰かがフォームを「二重送信」したときに何も起こらないことを確認することです。
ブラウザによっては、それができないこともありますが、これは良いことです!
最善の方法は、2 回目 (およびそれ以降) の試行を「これは単なる再送信です」と認識して無視できるように、十分なセッション処理ロジックを用意することです。
ここは見てなかったのでこちらに。
セッション変数が見つからない場合、フォームは処理されません。変数は見つかるとすぐに削除されるため、送信ボタンを押すことによってのみフォームを実行できます。更新して戻ると、フォームは送信されません。これは、リダイレクトを使用せずに機能します。
このコードは、現在のページから戻らないように機能します。
ここに、コンテキストメニューを開かず、ブラウザのリロード時にページを離れるかどうかを尋ねるのに役立つコードを配置します...
ブラウザの戻るボタンをクリックして質問しようとしています
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;
});
});});
ありがとう、
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();
}
これを行うと、ブラウザの戻るボタンを押すと、ユーザーはページの有効期限が切れているというメッセージを受け取ります
デモは次のとおりです。