Spring Securityではフォームベースの認証成功後のリダイレクト先をセッションに格納しています。
なので、セッションよりその情報を取得することで要件を満たす実装ができると思います。
例えば、認証が必要な下記のURLに未認証状態でアクセスした場合
http://localhost:8080/hogehoge/any_page/?param_a=123
↓ ログインページ
http://localhost:8080/hogehoge/login
ログインページのハンドラメソッドで、そのURLの情報を取得するにはHttpServletRequest
とHttpSession
を使用します。
実装例は下記の通りです。
java
1@RequestMapping(value = "/login", method = RequestMethod.GET)
2public String login(Model model, HttpServletRequest req) {
3
4 HttpSession session = req.getSession(false);
5 if (session != null) {
6 SavedRequest savedRequest = (SavedRequest) session.getAttribute("SPRING_SECURITY_SAVED_REQUEST");
7 if (savedRequest != null) {
8 // 認証成功後のリダイレクト先
9 String redirectUrl = savedRequest.getRedirectUrl();
10 System.out.println(redirectUrl);
11 // → http://localhost:8080/hogehoge/any_page/?param_a=123
12
13 // クエリパラメータ
14 Map<String, String[]> params = savedRequest.getParameterMap();
15 String[] values = params.get("param_a");
16 System.out.println(values);
17 // → 123
18 }
19 }
20
21 return "login";
22}
ポイントとなるところは下記の行です。
セッションにSPRING_SECURITY_SAVED_REQUEST
という名前で、元のリクエストオブジェクト(SavedRequest)が登録されています。
java
1SavedRequest savedRequest = (SavedRequest) session.getAttribute("SPRING_SECURITY_SAVED_REQUEST");
SavedRequestのgetRedirectUrl
メソッドで認証後のリダイレクト先URL、getParameterMap
メソッドでパラメータを取得できます。
java
1String redirectUrl = savedRequest.getRedirectUrl();
2
3Map<String, String[]> params = savedRequest.getParameterMap();
4String[] values = params.get("param_a");
なお、この仕組み(認証後のリダイレクト)についてはSavedRequest s and the RequestCache Interfaceをご覧頂き、とくに**「ベストエフォート」アプローチ**という点、ご留意ください。
Under normal circumstances, you shouldn’t need to modify any of this functionality, but the saved-request handling is a "best-effort" approach and there may be situations which the default configuration isn’t able to handle. The use of these interfaces makes it fully pluggable from Spring Security 3.0 onwards.
------------------------------------------------------------------------------------
通常の状況では、この機能を変更する必要はありませんが、保存されたリクエストの処理は「ベストエフォート」アプローチであり、デフォルトの構成では処理できない状況もあります。 これらのインターフェイスを使用すると、Spring Security 3.0以降から完全にプラグイン可能になります。