web-dev-qa-db-ja.com

Spring MVC Controller:URLにパラメーターを追加せずにリダイレクトする

パラメータをURLに追加せずにリダイレクトしようとしています。

@Controller
...
public class SomeController
{
  ...
  @RequestMapping("save/")
  public String doSave(...)
  {
    ...
    return "redirect:/success/";
  }

  @RequestMapping("success/")
  public String doSuccess(...)
  {
    ...
    return "success";
  }

リダイレクト後、私のURLは常に次のようになります:.../success/?param1=xxx&param2=xxx。 URLをRESTfulなものにしたいので、リダイレクト後にパラメーターが必要になることはないため、リダイレクトに追加することは望ましくありません。

それらを取り除く方法はありますか?

35
user871611

Spring 3.1では、オプション ignoreDefaultModelOnRedirect を使用して、モデル属性をリダイレクトに自動的に追加しないようにします。

<mvc:annotation-driven ignoreDefaultModelOnRedirect="true" />
30
Matroskin

Spring 3.1では、この動作を制御するための好ましい方法は、メソッドに RedirectAttributes パラメーターを追加することです。

@RequestMapping("save/")
public String doSave(..., RedirectAttributes ra)
{
    ...
    return "redirect:/success/";
}

デフォルトでは属性の追加を無効にし、明示的に追加する属性を制御できます。

Springの以前のバージョンでは、より複雑でした。

32
axtavt

RedirectAttributesパラメーターを追加しても機能しません(HandlerInterceptorAdapterがモデルにいくつかの要素を追加するためかもしれません)が、このアプローチは(@reallynicの コメント のおかげです):

@RequestMapping("save/")
public View doSave(...)
{
    ...
    RedirectView redirect = new RedirectView("/success/");
    redirect.setExposeModelAttributes(false);
    return redirect;
}
10
Lu55

Spring 4では、注釈を使用してJava configでこれを行う方法があります。必要に応じて誰かが必要に応じて共有しています。

WebMvcConfigurerAdapterを拡張する構成クラスで、次を追加する必要があります。

@Autowired
private RequestMappingHandlerAdapter requestMappingHandlerAdapter;


@PostConstruct
public void init() {
    requestMappingHandlerAdapter.setIgnoreDefaultModelOnRedirect(true);
}

これにより、RedirectAttributesを使用する必要がなくなり、Java config to Matroskin 's answer)と同等になります。

8
Mel

Spring 3.1を使用している場合は、 Flash Scope を使用できます。それ以外の場合は、ここで最も投票された(受け入れられない)回答で使用されている方法を確認できます。

Spring MVC Controllerは、応答ではなくURLパラメーターを使用してリダイレクトします

編集:

3.1ユーザー向けの素敵な記事:

http://www.tikalk.com/Java/redirectattributes-new-feature-spring-mvc-31

3.1以外のユーザーの回避策:

Spring MVCカスタムスコープBean

6
Andrea Ligios

これを試して:

public ModelAndView getRequest(HttpServletRequest req, Locale locale, Model model) {

    ***model.asMap().clear();*** // This clear parameters in url

    final ModelAndView mav = new ModelAndView("redirect:/test");

    return mav;
}
2
user7511364