春季3.2 MVC,如何重写控制器内的URL作为永久状态码RedirectView的一部分发送(Sp

2019-07-17 17:09发布

 @RequestMapping(value = "/Foo/{id}/{friendlyUrl:.*}", method = RequestMethod.GET)
 public ModelAndView getFoo(@PathVariable final Long id, @PathVariable final String friendlyUrl) {

所以它匹配ID,和任何字符串。 但我希望用户看到一个字符串,我指定。

foo = fooService.get(id); //use id from pathvariable
redirectView = new RedirectView(foo.getCorrectUrl()); //set url to correct url, not that in path
redirectView.setStatusCode(HttpStatus.MOVED_PERMANENTLY); //moved permanently
modelAndView = new ModelAndView(redirectView);
modelAndView.setViewName("myFoo.jsp");
return modelAndView;

一切工作正常,除了URL,用户看到的是不正确。

这是(应该是)相同的功能,当一个问题被标题上的计算器网站存在的问题改变。

编辑,现在做下面的,几乎工程

  return new ModelAndView("redirect:/Foo/"+id+"/"+foo.getUrl());

但是,它返回一个临时移动状态代码,我想永久301。

是他们的一种方式来获得既是重写后的URL,并使用弹簧MVC控制器永久移动状态代码?

Answer 1:

在你的代码有

foo = fooService.get(id); //use id from pathvariable
redirectView = new RedirectView(foo.getCorrectUrl()); //set url to correct url, not that in path
redirectView.setStatusCode(HttpStatus.MOVED_PERMANENTLY); //moved permanently
modelAndView = new ModelAndView(redirectView);
modelAndView.setViewName("myFoo.jsp");
return modelAndView;

要将呼叫modelAndView.setViewName("myFoo.jsp"); 有效地取代传递给ModelAndView的构造器视图(RedirectView的基准)的值。 所以,你不应该在这种情况下调用setViewName。



文章来源: Spring 3.2 mvc, how to rewrite url within controller as part of redirectview with permanent status code sent