5

私は、Jersey を使用する Web アプリに取り組んでいます。URIBuilder と seeOther レスポンスを使用して、get-after-post のようなものを実装しようとしています。目的は、ブラウザーが既にオンになっているのと同じ URI にリダイレクトすることですが、GET を強制することです。次のように少し動作します。

  1. リクエストは PUT 経由で届きます
  2. 処理された PUT 要求
  3. 返されたその他の応答を参照してください

ブラウザが 303 See Other を取得し、受信した URI に対して GET を実行すると、何が起こるはずです。残念ながら、代わりに URI に対して PUT を実行し (私が知る限り)、PUT がそれを上記のステップ 1. に送り返し、リダイレクト ループが発生します。

ここで何がうまくいかないのですか?

   private Response giveSeeOther(){
  /*Get the base URI builder*/
  final UriBuilder uriBuilder = m_uriInfo.getBaseUriBuilder();

  /* Some stuff to create the URI */
  final Map<String, Object> parameterMap = new HashMap<String, Object>();
  parameterMap.put("uid", getUid());

  final URI redirectUri = uriBuilder.path(SomeObject.class).
                                     path(SomeObject.class, "get").
                                     buildFromMap(parameterMap);

  /* See Other (303) */
  return Response.seeOther(redirectUri).build();}

これが see other メソッドのコードです。他にどのようなコードが必要かわかりませんが、お知らせください。

4

1 に答える 1

8

代わりに 301 HTTP 応答コードを使用する必要があります。

303 を使用することで、POST リクエストが維持され、それに応じてリダイレクトされます。301 を使用することで、リクエストは GET 経由で「永久に移動」されます。

なぜ誰かがこれをやりたいのか疑問に思うかもしれない他の読者のために、それはユーザーが Web ブラウザーの「リロード」機能を使用して POST データを複数回送信するのを防ぐためです (「腐った通信」の問題を持つユーザーがよく行う)。完全にロードされていない可能性がある「ありがとうございました」ページをリロードします。

ヒント: この方法でリダイレクトする場合、Cookie を使用して「ありがとうございました」ページに情報が確実に届くようにする場合は、通常の GET フォームと同じ方法で 1 つ以上のパラメーターをリクエストに追加する必要があります。意思。たとえば、注文 ID 番号が 82838 の場合、次のように「ありがとうございます」ページに渡すことができます。

http://www.example.com/order/thank-you.pl?orderid=82838

これには明らかな潜在的なセキュリティ上の問題があり、注文ステータスを表示する前に、注文 ID が実際に現在ログインしているユーザーに属していることを「ありがとう」ページのコードで確認することで簡単に解決できます (注文ステータス情報を含めたいと思います)。その「ありがとうございました」ページに -- この場合、ユーザーが注文ステータスを確認できるように「更新」ボタン {またはリンク} を含めると便利です。ステップ)。

お役に立てば幸いです。

于 2009-09-12T16:28:59.747 に答える