26

私はウェブ開発を行っています。

クレジットカードに関するページがあります。ユーザーが「更新」または「戻る」をクリックすると、トランザクションがもう一度実行されますが、これは望ましくありません。

これには、ブラウザの左上の「戻る」および「更新」ボタン、「右クリック->更新/戻る」、「F5」キーの押下が含まれます。これは、すべてではなく、特定の cgi ページでのみ実行されます。

Javascriptを使用してこれを行うことはできますか? または他の方法はありますか?

4

13 に答える 13

50

標準的な方法は、3 つのステップで行うことです。

  1. フォームページはフィールドを処理ページに送信します
  2. 処理ページはデータを処理し、結果ページにリダイレクトします
  3. 結果ページには結果が表示されるだけで、リロードしても害はありません。
于 2009-03-20T09:03:38.860 に答える
12

これは、基本的なブラウザーのユーザー エクスペリエンス モデルを壊します...ユーザーは常にブラウザーの [更新] ボタンと [戻る] ボタンを使用できる必要があります。ページを別の方法で修正することをお勧めします。

質問を更新して、使用しているサーバー言語/プラットフォーム/テクノロジーを含めると、誰かが解決策を提案できる場合があります。

于 2009-03-20T09:15:27.320 に答える
9

フォームを再送信するとトランザクションが重複するという単純な事実が心配です。フォームデータの各送信が一意であることを確認するために、何らかのチェックが必要です。

たとえば、フォームを送信するページには、フォームと共に送信される一意の ID を指定する必要があります。その後、ビジネス ロジックは、送信されたフォームが既に処理されていることを認識できる必要があります ((もはや) 一意の ID は同じではないため)。そのため、2 回目の試行は無視されます。

「標準的な方法」でも、クライアントが [戻る] ボタンを 2 回クリックするのを止めることはできません。また、(何らかの理由で) フォームが処理されたと思わない場合は、戻ってフォームを再送信することさえできません。

于 2009-03-20T09:20:05.247 に答える
7
  1. ランダムな文字列を生成してセッションに保存し、

  2. 次に、それを非表示の値としてフォームに出力します。

  3. 送信された変数を確認し、一致する場合はリクエストを処理します。

  4. 1に移動します。

于 2012-08-08T12:47:14.097 に答える
3

このコードをフォーム ページに配置します

Response.Cache.SetCacheability(HttpCacheability.NoCache);

Response.Cache.SetExpires(DateTime.Now-new TimeSpan(1,0,0));

Response.Cache.SetLastModified(DateTime.Now);

Response.Cache.SetAllowResponseInBrowserHistory(false);
于 2009-05-08T01:37:46.963 に答える
2

これらのアクションを「ブロック」しようとしないでください。あなたがすべきことは、誰かがフォームを「二重送信」したときに何も起こらないことを確認することです。

于 2009-03-20T09:18:34.050 に答える
1

ブラウザによっては、それができないこともありますが、これは良いことです!

于 2009-03-20T09:20:07.667 に答える
1

最善の方法は、2 回目 (およびそれ以降) の試行を「これは単なる再送信です」と認識して無視できるように、十分なセッション処理ロジックを用意することです。

于 2009-03-20T09:21:19.240 に答える
1

ここは見てなかったのでこちらに。

  1. 一意のトークンをフォームに入れます。
  2. 送信ボタンは、サーバーへの xmlhttp(ajax) リクエストをトリガーし、保存された値が 1 のトークンにちなんで名付けられたセッション変数を作成します。
  3. ajax リクエストは、肯定的な状態変更を受け取った後にフォームを送信します。
  4. フォーム処理スクリプトは、保存された値が 1 のセッション変数をチェックします。
  5. スクリプトはセッション変数を削除し、フォームを処理します。

セッション変数が見つからない場合、フォームは処理されません。変数は見つかるとすぐに削除されるため、送信ボタンを押すことによってのみフォームを実行できます。更新して戻ると、フォームは送信されません。これは、リダイレクトを使用せずに機能します。

于 2014-05-22T23:59:31.627 に答える
0

このコードは、現在のページから戻らないように機能します。

ここに、コンテキストメニューを開かず、ブラウザのリロード時にページを離れるかどうかを尋ねるのに役立つコードを配置します...

ブラウザの戻るボタンをクリックして質問しようとしています

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;
    });
});});

ありがとう、

于 2014-07-25T12:16:57.197 に答える
0

vartec:s ソリューションは、バックの問題ではなくリロードの問題を解決するため、その解決策を次に示します。

  1. フォーム ページはセッション変数を設定します。たとえば、session("fromformpage")=1
  2. 処理ページはセッション変数をチェックし、その ="1" の場合はデータを処理し、="1" 以外の場合は結果ページにリダイレクトし、結果ページにリダイレクトします。
  3. 結果ページは、セッション変数を "" に設定します。

次に、ユーザーが戻るボタンを押している場合、処理ページはプロセスを再度実行せず、プロセス ページにリダイレクトするだけです。

于 2009-03-20T09:16:33.057 に答える
0

この 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();
}

これを行うと、ブラウザの戻るボタンを押すと、ユーザーはページの有効期限が切れているというメッセージを受け取ります

デモは次のとおりです。

ここに画像の説明を入力

于 2013-12-17T10:21:46.147 に答える