java - sirve - Controlador Spring MVC: redirigir sin agregar parámetros a mi url
recibir parametros spring (6)
Estoy intentando redirigir sin que se agreguen parámetros a mi URL.
@Controller
...
public class SomeController
{
...
@RequestMapping("save/")
public String doSave(...)
{
...
return "redirect:/success/";
}
@RequestMapping("success/")
public String doSuccess(...)
{
...
return "success";
}
Después de un redireccionamiento, mi URL siempre se ve así: .../success/?param1=xxx¶m2=xxx
. Como quiero que mis URL sean algo RESTful y nunca necesito los parámetros después de una redirección, no quiero que se agreguen a una redirección.
¿Alguna idea de cómo deshacerse de ellos?
Agregar el parámetro RedirectAttributes
no funciona para mí (puede deberse a que HandlerInterceptorAdapter agrega algunas cosas al modelo), pero este enfoque sí lo hace (gracias al comment de @anynic):
@RequestMapping("save/")
public View doSave(...)
{
...
RedirectView redirect = new RedirectView("/success/");
redirect.setExposeModelAttributes(false);
return redirect;
}
En Spring 3.1, una forma preferida de controlar este comportamiento es agregar un parámetro RedirectAttributes
a su método:
@RequestMapping("save/")
public String doSave(..., RedirectAttributes ra)
{
...
return "redirect:/success/";
}
Deshabilita la adición de atributos de forma predeterminada y le permite controlar qué atributos agregar de forma explícita.
En versiones anteriores de Spring, era más complicado.
En Spring 3.1, use la opción ignoreDefaultModelOnRedirect para deshabilitar automáticamente la adición de atributos del modelo a una redirección:
<mvc:annotation-driven ignoreDefaultModelOnRedirect="true" />
En Spring 4 hay una forma de hacer esto con java config, usando anotaciones. Lo estoy compartiendo en caso de que alguien lo necesite ya que lo necesitaba.
En la clase de configuración que extiende WebMvcConfigurerAdapter
, debe agregar:
@Autowired
private RequestMappingHandlerAdapter requestMappingHandlerAdapter;
@PostConstruct
public void init() {
requestMappingHandlerAdapter.setIgnoreDefaultModelOnRedirect(true);
}
Con esto, no necesita usar RedirectAttributes
, y es un equivalente en la configuración de java a la respuesta de Matroskin .
Prueba esto:
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;
}
Si está utilizando Spring 3.1, puede usar Flash Scope ; de lo contrario, puede ver el método utilizado en la respuesta más votada (no aceptada) aquí:
Spring MVC Controller redirige utilizando parámetros de URL en lugar de en respuesta
EDITAR:
Buen artículo para 3.1 usuarios:
http://www.tikalk.com/java/redirectattributes-new-feature-spring-mvc-31
Solución alternativa para usuarios que no sean 3.1: