パラメータデータを追加しながら、リクエストを別のコントローラに転送する方法はありますか?ModelMapに追加してみましたが、ぶらぶらしていないようです。私は次のようなことをしています:
return "forward:/my-other-controller";
私が考えることができる他の唯一の方法は、パラメーターをセッションに配置してから、それらをターゲットコントローラーにポップオフすることです。
パラメータデータを追加しながら、リクエストを別のコントローラに転送する方法はありますか?ModelMapに追加してみましたが、ぶらぶらしていないようです。私は次のようなことをしています:
return "forward:/my-other-controller";
私が考えることができる他の唯一の方法は、パラメーターをセッションに配置してから、それらをターゲットコントローラーにポップオフすることです。
最も簡単な方法は、リクエストにデータを追加することです。これは転送であるため、同じ要求がサーバー内の異なるハンドラーに渡されます。
例として、一方が他方に転送する2つのコントローラーの簡単なセットアップから始めましょう。
@Controller
public class TestController {
@RequestMapping(value="/test")
public String showTestPage() {
return "forward:/test2";
}
}
@Controller
public class TestController2 {
@RequestMapping(value="/test2")
public String showTestPage() {
return "testPageView";
}
}
データを追加する最初の方法は、リクエストの属性としてデータを設定することです。新しいコントローラーは次のようになります(A):
@Controller
public class TestController {
@RequestMapping(value="/test")
public String showTestPage(HttpServletRequest request) {
request.setAttribute("param1", "foo");
request.setAttribute("param2", "bar");
return "forward:/test2";
}
}
@Controller
public class TestController2 {
@RequestMapping(value="/test2")
public String showTestPage(HttpServletRequest request) {
String param1 = (String) request.getAttribute("param1");
String param2 = (String) request.getAttribute("param2");
return "testPageView";
}
}
転送プレフィックスのビュー名は基本的にURLであるため、次のバージョンを使用することもできます(属性をパラメーターに変更)(B)。
@Controller
public class TestController {
@RequestMapping(value="/test")
public String showTestPage() {
return "forward:/test2?param1=foo¶m2=bar";
}
}
@Controller
public class TestController2 {
@RequestMapping(value="/test2")
public String showTestPage(HttpServletRequest request) {
String param1 = request.getParameter("param1");
String param2 = request.getParameter("param2");
return "testPageView";
}
}
代わりに注釈を使用して、2番目のコントローラーをさらに単純化することもできます。
@Controller
public class TestController2 {
@RequestMapping(value="/test2")
public String showTestPage(@RequestParam String param1, @RequestParam String param2) {
return "testPageView";
}
}
そして、それを楽しむために、そしてSpringのバインディング動作を実際に示すために、次のようにすることもできます(C):
@Controller
public class TestController {
@RequestMapping(value="/test")
public String showTestPage() {
return "forward:/test2?param1=foo¶m2=bar";
}
}
@Controller
public class TestController2 {
@RequestMapping(value="/test2")
public String showTestPage(@ModelAttribute DummyBinder params) {
String param1 = params.getParam1();
String param2 = params.getParam2();
return "testPageView";
}
}
class DummyBinder {
private String param1;
private String param2;
public String getParam1() {
return param1;
}
public void setParam1(String param1) {
this.param1 = param1;
}
public String getParam2() {
return param2;
}
public void setParam2(String param2) {
this.param2 = param2;
}
}
私は個人的に、多くのパラメーターについてはソリューションAを使用し、いくつかのパラメーターについてはソリューションBを使用します。ソリューションCには、一種の「ハァッ...?!」があります。効果があるので、私はそれを避けます(また、URLに追加されたパラメーターで機能するので、それらのいくつかまたはあなたは厄介なURLを取得します)。
セッションにデータを追加することも当然のことながら機能しますが、データの寿命を不必要に延長するため、2番目のコントローラーへの移行中にリクエストにデータを追加するのが最適です。
リダイレクトと同じように転送を検討しますが、この意味でコンテキストとホストは必要ありません(転送はサーバーによって内部的に処理されますが、リダイレクトはユーザーのブラウザーに別のURLを要求するように指示します)。
したがって、はい、セッション、Cookieを使用するか、パラメータを投稿または取得します。
フィルタを検討しましたか?委任フィルタープロキシを使用してフィルターを作成できます。これにより、リクエストパラメーターとSpringBeanにアクセスできます。
私はこの投稿を見つけました、それは:を使用していHttpRequestWrapper
ます
最初に:
を定義し、投稿のメソッド、、などをHttpRequestWrapper
オーバーライドします。getParameter
getParameterMap
getParameterNames
getParameterValues
2番目:メソッドパラメーターでラップされたリクエスト
を使用して、RequestDispatcherを介してURLに転送します。
request.getRequestDispatcher("myForwardUrl").forward(new MyRequestWrapper(request), response);
私はこれをパラメータの削除のために試しました(これはさらに難しいです!)そしてそれはうまくいきます!