ユーザーが反撃した場合、同じ情報を再送信し、データの流れと整合性を台無しにする可能性があるアプリケーションを作成しています。JavaScript をオンまたはオフにしているユーザーに対して無効にするにはどうすればよいですか?
12 に答える
残念ながら、それは不可能です。ただし、アプリケーションのナビゲーション モデルを考慮してください。Post/Redirect/Get PRG Model を使用していますか? http://en.wikipedia.org/wiki/Post/Redirect/Get ?
このモデルは、ポストバック モデルよりも戻るボタンが使いやすいです。
すべきではありません。
ページの onbeforeunload イベントに何らかのスクリプトを添付して、ユーザーが何をしたいのかをユーザーに確認することができます。もう少し進んで無効にすることもできますが、もちろん、これは JavaScript がオンになっているユーザーに対してのみ機能します。代わりに、各ページの送信時にトランザクションをコミットするのではなく、プロセスの最後にのみトランザクションをコミットするようにアプリを書き直すことを検討してください。
戻るボタンを壊さないように、英雄的な努力をすることを強くお勧めします。これは、ユーザーを遠ざける確実な方法であり、Jacob Neilsen の 1999 年の Web デザインの間違いトップ 10で第 1 位になったことさえあります。
おそらく、「<ここにシナリオを挿入> の [戻る] ボタンが壊れないようにするにはどうすればよいですか?」という質問をすることを検討することもできます。
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 がないと、古いウィンドウを強制的に閉じるのが難しい場合があります。
以下を使用してこれを達成できました。
Response.Cache.SetExpires(DateTime.MinValue);
Response.Cache.SetNoStore();
Response.Cache.SetCacheability(HttpCacheability.NoCache); を使用した場合 Office ファイルをダウンロードできませんでした。