質問

ユーザーが反撃すると、同じ情報が再送信され、データのフローと整合性が台無しになる可能性があるアプリケーションを作成しています。JavaScript を有効にしているユーザーと無効にしているユーザーに対して無効にするにはどうすればよいですか?

役に立ちましたか?

解決

残念ながらそれは不可能です。ただし、アプリケーションのナビゲーション モデルを考慮してください。Post/Redirect/Get PRG Modelを使用していますか? http://en.wikipedia.org/wiki/Post/Redirect/Get?

このモデルは、Postback モデルよりも戻るボタンに適しています。

他のヒント

そうすべきではありません。

ページの onbeforeunload イベントに何らかのスクリプトを添付して、ユーザーが何をしたいのかをユーザーに確認することができます。そして、もう少し先に進むことができます 試す無効にする ただし、もちろん、これは JavaScript が有効になっているユーザーに対してのみ機能します。代わりに、各ページ送信時にトランザクションをコミットせず、プロセスの最後にのみトランザクションをコミットするようにアプリを書き直すことを検討してください。

「戻る」ボタンを壊さないように英雄的な手段を講じることを強くお勧めします。これはユーザーを遠ざける確実な方法であり、 ジェイコブ・ニールセンの 1999 年の Web デザインの間違いトップ 10.

おそらく、次のような質問をすることを検討してみてはいかがでしょうか。「<ここにシナリオを挿入> の戻るボタンを壊さないようにするにはどうすればよいですか?」

Scott の答えが的中している場合は、フローを PRG モデルに変更することを検討してください。他のものである場合は、もう少し詳しく説明し、どのようにサポートできるかを確認してください。

JavaScript を使用して「戻る」ボタンを無効にするちょっとしたハックを思いつきました。Chrome 10、Firefox 3.6、IE9で確認しました。

<!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" >
<title>Untitled Page</title>
<script type = "text/javascript" >
function changeHashOnLoad() {
     window.location.href += "#";
     setTimeout("changeHashAgain()", "50"); 
}

function changeHashAgain() {
  window.location.href += "1";
}

var storedHash = window.location.hash;
window.setInterval(function () {
    if (window.location.hash != storedHash) {
         window.location.hash = storedHash;
    }
}, 50);


</script>
</head>
<body onload="changeHashOnLoad(); ">
Try to hit back!
</body>
</html>

最善の選択肢は、フローを制御するためにポストバックに依存しないことですが、(今のところ) ポストバックに依存している場合は、

次のようなものを使用できます:

  Response.Cache.SetCacheability(HttpCacheability.NoCache);
  Response.Cache.SetExpires(Now.AddSeconds(-1));
  Response.Cache.SetNoStore();
  Response.AppendHeader("Pragma", "no-cache");

すべてのブラウザで機能しないことがすぐにわかりますが、その場合はコードに次のようなチェックを導入できます。

 if (Page.IsPostBack)
 {
        if (pageIsExpired()){
           Response.Redirect("/Some_error_page.htm");
        }
        else {
           var now = Now;
           Session("TimeStamp") = now.ToString();
           ViewState("TimeStamp") = now.ToString();
        }

  private boolean pageIsExpired()
  {
     if (Session("TimeStamp") == null || ViewState("TimeStamp") == null)
        return false;

     if (Session("TimeStamp") == ViewState("TimeStamp"))
        return true;

        return false;
  }

これで問題はある程度解決しますが、コードはチェックされていません -- 例としてのみ使用されます。

すべての主要なブラウザで戻るボタンを無効にすることができます。ハッシュ値を使用して「戻る」ボタンを完全に無効にするだけです。これらの 5 行のコードをページに挿入するだけです

 <script>
window.location.hash="no-back-button";
window.location.hash="Again-no-back-button";//for google chrome
window.onhashchange=function(){window.location.hash="no-back-button";}
</script> 

詳細な説明

これに関する以前の投稿は次のとおりです。「戻る」ボタンの使用を禁止する (IE の場合)

「戻る」ボタンを無効にするために何を考えても、将来のブラウザでは「戻る」ボタンが停止しない可能性があります。

開発サイクルの後半にある場合は、上記のいくつかの提案を試すことをお勧めしますが、時間があるときに、「戻る」ボタンがサイトのロジックを妨げないようにフローを構成する必要があります。次のように、「戻る」ボタンは単にユーザーを前のページに戻すだけです。彼らはそうすることを期待しているのです。

確かに、重複データによって混乱が生じないよう、適切な検証を追加する必要があります。ただし、私の場合と同様、フォームの後にサードパーティの API を使用しているため、データを完全に制御することはできません。それでこれを使いました

history.go(+1);

これにより、ユーザーが「支払い」ページに戻ろうとした場合(たとえば支払いを行うだけ)、「支払い」ページの後に表示されるはずの「領収書」に転送されます。ただし控えめに使用してください

各フォームのデータを _NEW ウィンドウに投稿できます。これにより、各ウィンドウの「戻る」ボタンが無効になりますが、JavaScript がなければ古いウィンドウを強制的に閉じるのは難しいかもしれません。

Rolla の 4 人が、昔 (遠く離れた銀河系で) 戻るボタンの無効化についてこの記事を書きました。 http://www.4guysfromrolla.com/webtech/111500-1.shtml

以下を使用してこれを実現できました。

 Response.Cache.SetExpires(DateTime.MinValue);
 Response.Cache.SetNoStore();

Response.Cache.SetCacheability(HttpCacheability.NoCache); を使用したときオフィスファイルをダウンロードできなくなりました。

以下のリンクを見つけてください

ASP.NETでJavaScriptを使用してブラウザバックボタン機能を無効にします| ASP.NET BROWSERバックボタンを無効にする(JavaScriptを使用)

http://www.aspdotnet-suresh.com/2011/11/disable-browser-back-button.html

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top