22

プログラムを書いていますが、問題が発生します。jspページを更新すると、システムが自動的にページ全体を再送信します。それを回避する方法がわかりません。誰かが私を助けてくれますか?

4

7 に答える 7

23

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

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

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

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

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

于 2009-08-23T02:26:39.083 に答える
15

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

  1. 投稿 + リダイレクト + GET ; また
  2. AJAX フォームの送信。

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

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

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

これは、このJSP の例です。

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

于 2009-08-23T01:46:43.133 に答える
3

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

<script>
if ( window.history.replaceState ) {
  window.history.replaceState( null, null, window.location.href );
}
</script>
于 2019-06-26T07:12:07.670 に答える
0

データの送信やその他の変更にGETを使用しないでください。代わりにPOSTを使用してください。あなたは読むためにあなたのフォームを変更したいと思うでしょう

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

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

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

于 2009-08-23T01:32:07.770 に答える
0

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

よろしく!

于 2010-08-25T09:41:14.027 に答える
0

ここに解決策があります

@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;
    }
}   
于 2014-08-19T09:46:53.783 に答える