概要
この記事では、春にリダイレクトの実装に焦点を当て、各戦略の背後にある理由について説明します。
なぜリダイレクトするのですか?
まず、春のアプリケーションでリダイレクトを行う必要がある理由を考えてみましょう。
もちろん、多くの可能な例と理由があります。単純なものは、フォームデータをポストフォームデータ、問題の二重の提出、または実行フローを別のコントローラーメソッドに委任するだけです。
注意すべきことの1つは、典型的な投稿/リダイレクト/GETパターンが二重のコミットの問題を適切に解決しないことです。最初のコミットが完了する前にページを更新するという問題は、依然として二重のコミットになる可能性があります。
RedirectViewを使用してリダイレクト
この簡単な方法から始めましょう - 直接例を挙げましょう。
RedirectViewの背後には、httpservletResponse.sendredirect()が発生します。これにより、実際のリダイレクトが実行されます。
ここでリダイレクトされたプロパティをメソッドに挿入する方法に注意してください - フレームワークは、これらのプロパティと対話できるように、重い作業のこの部分を行います。
モデルRedirectattributesに属性を追加します - それをHTTPクエリパラメーターとして公開します。モデルにはオブジェクトが含まれています - 通常、文字列または文字列に変換できる文字列またはオブジェクトが含まれます。
次に、リダイレクト関数をテストしましょう - 簡単なCurlコマンドを使用してそれを支援します。
結果は次のとおりです。
リダイレクトを使用してリダイレクト:プレフィックス
以前の方法では、いくつかの理由で最適ではないため、RedirectViewを使用します。
まず、コードでRedirectViewを直接使用するため、Spring APIに結合されます。
第二に、コントローラー操作を実装するときにその結果が常にリダイレクトされることを最初から知る必要がありますが、これは常にそうであるとは限りません。
より良いオプションは、リダイレクトを使用することです。プレフィックス - リダイレクトビュー名は、他の論理ビュー名と同様にコントローラーに挿入されます。コントローラーは、リダイレクトが起こっていることさえ知りません。
このように見えます:
ビュー名がRedirect:で返されると、URLベースのViewResolverクラス(およびそのすべてのサブクラス)は、リダイレクトする必要がある特別な兆候として認識します。ビュー名の残りの部分は、リダイレクトURLとして扱われます。
ここに注意する場所があります - ここでリダイレクト:/redirectedurlの論理ビューを使用する場合、現在のサーブレットコンテキストに関連するリダイレクトを行っています。
絶対URLにリダイレクトする必要がある場合は、次のような名前を使用できます:redirect:http:// localhost:8080/spring-redirect/redirecedurl。
だから今、私たちがCurlコマンドを実行するとき:
すぐにリダイレクトを取得します。
フォワードプレフィックスを使用した転送
それでは、わずかに違うことをする方法を見てみましょう - 転送。
コードを見る前に、転送とリダイレクトのセマンティクスの迅速かつ高レベルの要約を見てみましょう。
リダイレクトは、302応答コードとロケーションヘッダーを含む新しいURLで応答します。その後、ブラウザ/クライアントは、サーバー側の新しいURLに完全に転送されるリクエストを行います。サーブレットコンテナは、同じ要求をターゲットURLに転送します。ブラウザのURLを変更する必要はありません
それでは、コードを見てみましょう。
redirect:、forward:prefixは、urlbasedViewResolverとそのサブクラスによって解析されます。内部的には、新しいビューに対してrequestdispatcher.forward()操作を実行する内部ResourceViewを作成します。
Curlでコマンドを実行するとき:
HTTP 405(許可されていない方法)を取得します。
この場合、リダイレクトソリューションにある2つの要求と比較して、ブラウザ/クライアントからサーバー側に送信された要求は1つだけです。もちろん、リダイレクトによって追加されたプロパティは必要ありません。
Redirectattributesを含むプロパティ
次に、リダイレクトでのパスプロパティを見てみましょう - フレームワークでのリダイレクトトリビアを利用してください。
前述のように、プロパティオブジェクトをメソッドに直接挿入できます。これにより、メカニズムが非常に使いやすくなります。
また、フラッシュ属性も追加することに注意してください。これは、URLに追加されないプロパティです。このプロパティを達成できます - 後でリダイレクトされた最終ターゲットメソッドで@modelattribute( "flashattribute")を使用して、フラッシュ属性にアクセスできます。
したがって、正常に完了してください-Curlを使用して関数をテストする必要がある場合:
新しい場所にリダイレクトされます。
このようにして、ModelMapの代わりにRedirectattriburesを使用すると、リダイレクト操作に含まれる2つの方法間でいくつかのプロパティを共有することができます。
接頭辞のない別の構成
次に、別の構成 - プレフィックスなしのリダイレクトを検討しましょう。
これを達成するには、org.springframework.web.servlet.view.xmlviewResolverを使用する必要があります。
org.springframework.web.servlet.view.internalresourceViewResolverの代わりに、以前の構成で使用していました。
また、構成内のRedirectView Beanを定義する必要があります。
これで、この新しいBeanをIDを介して参照して、リダイレクトをトリガーできます。
テストするには、Curlコマンドを再度使用します。
結果は次のとおりです。
HTTP POSTリクエストリクエストをリダイレクトします
銀行の支払いなどのユースケースの場合、HTTPの投稿リクエストをリダイレクトする必要がある場合があります。返されたHTTPステータスコードに応じて、POSTリクエストはHTTP GETまたはPOSTにリダイレクトできます。
HTTP 1.1プロトコルリファレンスによれば、ステータスコード301(永続的に削除)および302(見つかった)により、リクエストメソッドをポストから取得に変更できます。この仕様では、リクエストメソッドをPOSTから取得に変更できない関連する307(一時リダイレクト)および308(永久リダイレクト)ステータスコードも定義します。
次に、POSTリクエストを別のPOSTリクエストにリダイレクトするためのコードを見てみましょう。
次に、CURLコマンドを使用して、リダイレクトされた投稿をテストしましょう。
私たちは宛先アドレスにリダイレクトされています:
結論は
この記事では、春にリダイレクトを実装する3つの異なる方法、これらのリダイレクトを実行する際の属性を処理/パスする方法、およびHTTP POSTリクエストのリダイレクトを処理する方法を紹介します。
上記は、編集者が紹介したVSPRING Redirection(Redirect)ガイドと関連する戦略の問題です。それがあなたに役立つことを願っています。ご質問がある場合は、メッセージを残してください。編集者は時間内に返信します。 wulin.comのウェブサイトへのご支援ありがとうございます!