web-dev-qa-db-ja.com

更新時にjspでの再送信を回避するにはどうすればよいですか?

プログラムを作成していますが、問題が発生します。JSPページを更新すると、システムが自動的にページ全体を再送信します。回避方法がわからないのですが、誰かが私を助けてくれますか?

19
MemoryLeak

これが問題の説明です...

フォームの「送信」ボタンをクリックすると、フォームに入力されたすべてのデータを含むリクエストがWebサーバーに送信されます。 URLだけでなくフォームデータもリクエストの一部であり、このリクエストはブラウザに記憶されます。ユーザーが「更新」をクリックすると、ブラウザーは要求を繰り返し、同じURL andフォームデータをWebサーバーに再度送信します。

ただし、フォームは、「form」タグの「method」属性に応じて、GETまたはPOSTの2つの異なる方法で送信できます。 GETリクエストには副作用がないという規約があります。データをフェッチするだけで、データベースに変更を加えることはありません。一方、リクエストがデータを変更する場合は、常にPOSTリクエストを使用する必要があります。前述のとおり、これらは規則にすぎず、技術的な違いはあまりありませんが、非常に重要です違いは、ブラウザがPOST-「更新」をクリックすると、操作が繰り返される可能性があることを警告するダイアログボックスがポップアップするGETリクエストを更新するときに、ブラウザはこの確認を表示しません。

@mkが疑うように、フォームはGETメソッドを使用していますか?もしそうなら、これをPOSTに変更することが最も簡単な解決策です。これは、ユーザーが更新しようとすると警告が表示されることを意味します。

しかし、より良い解決策は、@ cletusによって提案されたPOST + REDIRECT + GETイディオムです。これにより、データベースの更新(POST)とビュー(GET)が2つの操作に分割されます。ブラウザーで[更新]をクリックすると、GETが繰り返されるだけで、副作用はありません。

20
Todd Owen

ここで必要なイディオムは次のいずれかです。

  1. POST + REDIRECT + GET ;または
  2. AJAXフォームの送信。

POST + REDIRECT + GETは次のように機能します。

  1. フォームの送信にはPOSTメソッドを使用します。
  2. JSPまたは(うまくいけば)サーブレットがPOSTを受信すると、必要な処理(データの保存や更新など)が実行されます。
  3. 次に、サーブレットまたはJSPはLocation:HTTPヘッダーを使用して、ユーザーをおそらく同じURLにリダイレクトします。

この利点は、[再読み込み]をクリックしてもフォームが再送信されないことです。また、ブラウザの戻るボタンをクリックしても、「再送信しますか?」というプロンプトは表示されません。ダイアログボックス。

これが JSPの例 です。

AJAX submitとは、従来の意味でサーバーにフォームを送信する代わりに、フォームデータを使用してAJAXリクエストをサーバーに送信することです。その送信は必要なことを行います。[再読み込み]をクリックすると、ページが再読み込みされます。AJAXリクエストは再送信されません。

12
cletus

サーバーサイドでJSPを使用し、コントローラサーブレットを使用してページの方向を制御している場合。ページ方向モードを「フォワード」から「ページリダイレクト」に変更するだけです。これにより、フォームの再送信を防ぐことができます。 これを理解しておくと便利です

よろしく!

0
didxga

データの送信やその他の変更にGETを使用しないでください。代わりにPOSTを使用してください。フォームを変更して、

<form action="test.jsp" method="get">

詳細は http://www.google.com/search?q=get+post を参照してください。

(あなたの質問も少し不明瞭です-ブラウザーまたはコンテナー(Tomcatなど)で更新することを意味しますか?ページを再送信することはどういう意味ですか?ページは送信されず、フォームは送信されます。どのシステムですか?つまり、他に何か意味がある場合はお知らせください。)

0
mk.

次のスクリプトを使用して動作します。

<script>
if ( window.history.replaceState ) {
  window.history.replaceState( null, null, window.location.href );
}
</script>
0
Ganesh Giri

Post/Redirect/Get(PRG)pattern を使用して、同じデータの複数の送信の問題を解決できます。

次のように機能します:

ユーザーが初めてPOSTまたはGETメソッドでフォームをサーバーに送信するとき、アプリケーションデータベースの状態を更新します。

次に、リダイレクト応答を送信して、クライアントに応答を送信します。

次に、GETコマンドを使用してビューをロードします。これで送信されるデータはありません。これは新しいJSPページなので、複数の送信から安全です。リクエストを処理するコードはべき等です。したがって、同じリクエストに対して同じアクションを2回実行することはありません。

enter image description here

0
Premraj

これが解決策です

@RequestMapping(value="masterrulescreation")
protected ModelAndView masterrules(HttpServletRequest request, HttpServletResponse     response) throws Exception {
    try {   

        if(request.getParameter("ruleCode")!=null && request.getParameter("ruleCode")!="") //check the primary key is not null ,if goes for submission
        {
        request.setCharacterEncoding("UTF-8");

        String xxx=request.getParameter("xxx");
        S
        boolean result=object.method(xxx);
        String message="";//reurning a messgae is sucess
        if(result==true)
        {
            message="Data Saved successfully";
        }
        else
        {
            message="Error while saving data";  
        }

        return  (new ModelAndView(getMasterrulescreation(),"message",message));
        }
        else //if no value in primary key redirect fresh page 
        {
            return  (new ModelAndView(getMasterrulescreation()));
        }
    }
    catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}   
0
alex john