1

このような問題があります:Spring Security 3を使用する場合、ログインする必要があるときにリソース(GET経由)またはコミットフォーム(POST経由)を要求しようとします。 GET リクエスト (POST リクエストを作成しようとしても)。それで、どうすれば修正できるのだろうか?または、Spring Security が GET リクエストのみを保存して POST をスキップできるようにするにはどうすればよいでしょうか?

DefaultSavedRequest でそのようなコードを見つけました:

public boolean doesRequestMatch(HttpServletRequest request, PortResolver portResolver) {

    ...

    if (!"GET".equals(request.getMethod()) && "GET".equals(method)) {
        // A save GET should not match an incoming non-GET method
        return false;
    }

私が理解しているように、このメソッドはキャッシュリクエストと受信リクエストを比較し、受信リクエストがGETではなく、保存リクエストがGETである場合にのみ、リクエストが等しくないことを示しています。したがって、私の場合、保存リクエストは POST であり、受信は GET であるため、等しいと返されるため、正しく動作しません。私はそれで何ができますか?それはバグですか、それともそのような特定の比較に何らかの意味がありますか?

アップデート。 エラーを再実行すると、プライマリ説明が完全ではありませんでした。私はそれをより詳細に説明しようとします。フォームを開くGET URLがあり、ポップアップメッセージウィンドウでPOSTと同じURLでAJAX経由でコミットします。GET URL を実行すると、フォームが開きます。ログアウトしてから、フォームをコミットしてみます。ポップアップ ウィンドウ出力エラー。ログインして URL にリダイレクトしましたが (GET/POST 要求と同じです)、画面にはフォームが表示されませんが、AJAX 要求の JSON 応答と Firebug では、ログイン後に POST 要求が実行されることがわかります。ログイン後にキャッシュフィルターを削除すると同じURLにリダイレクトされるのですが、POSTリクエストとしてではなく、通常のGETリクエストとして機能し、フォームを開きます。

4

1 に答える 1

2

マニュアルに記載されているように、保存されたリクエストの処理は「ベストエフォート」アプローチです。それはすべての人にとってすべてのものになることはできません。ログインの実行中にリクエストをキャッシュし(リクエストメソッド、GET、POSTなどに関係なく)、ログイン後にキャッシュされたURLにリダイレクトします。

リダイレクト後の着信リクエストはGETになります(たとえば、POSTにリダイレクトすることはできません)。そのため、これをキャッシュされたリクエストと照合し、キャッシュされたリクエストを使用して置き換えるかどうかを決定するために最善を尽くします。したがって、ログインが発生したことがないかのように続行します。

あなたが投稿したコードは、ユーザーがGETリクエストを行おうとした後、ログインを求められた場合を示しています。同じURLへの後続のリクエストがGETでない場合、それはログイン後のリダイレクトの結果ではないため、キャッシュされたリクエストを使用して置き換えることはできません。

RequestCache名前空間要素を使用してカスタマイズするrequest-cacheか、no-op実装に置き換えることができます。キャッシュされたリクエストを使用したくない場合は、構成のalways-use-default-targetプロパティをform-login設定できます。

于 2013-01-10T13:31:11.530 に答える