web-dev-qa-db-fra.com

Spring MVC Controller: rediriger sans ajouter de paramètres à mon URL

J'essaie de rediriger sans ajouter de paramètres à mon URL.

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

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

Après une redirection, mon URL ressemble toujours à ceci: .../success/?param1=xxx&param2=xxx. Étant donné que je veux que mes URL soient plutôt RESTful et que je n'ai jamais besoin des paramètres après une redirection, je ne veux pas qu'ils soient ajoutés sur une redirection.

Des idées pour s'en débarrasser?

35
user871611

Dans Spring 3.1, utilisez l'option ignoreDefaultModelOnRedirect pour désactiver l'ajout automatique d'attributs de modèle à une redirection:

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

Dans Spring 3.1, un moyen préféré de contrôler ce comportement consiste à ajouter un paramètre RedirectAttributes à votre méthode:

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

Il désactive l'ajout d'attributs par défaut et vous permet de contrôler les attributs à ajouter explicitement.

Dans les versions précédentes de Spring, c'était plus compliqué.

32
axtavt

L'ajout du paramètre RedirectAttributes ne fonctionne pas pour moi (peut-être parce que mon HandlerInterceptorAdapter ajoute des éléments au modèle), mais cette approche le fait (grâce à @ reallynic comment ):

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

Au printemps 4, il existe un moyen de le faire avec la configuration Java, en utilisant des annotations. Je la partage au cas où quelqu'un en aurait besoin comme j'en avais besoin.

Sur la classe de configuration qui étend WebMvcConfigurerAdapter, vous devez ajouter:

@Autowired
private RequestMappingHandlerAdapter requestMappingHandlerAdapter;


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

Avec cela, vous n'avez pas besoin d'utiliser RedirectAttributes, et c'est un équivalent dans Java config to Matroskin's answer.

8
Mel

Si vous utilisez Spring 3.1, vous pouvez utiliser Flash Scope , sinon vous pouvez consulter la méthode utilisée dans la réponse la plus votée (non acceptée) ici:

Redirection du contrôleur Spring MVC en utilisant les paramètres d'URL plutôt qu'en réponse

ÉDITER:

Bel article pour les utilisateurs 3.1:

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

Solution pour les utilisateurs non 3.1:

bean de portée personnalisé Spring MVC

6
Andrea Ligios

Essaye ça:

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