我尝试重定向301 Status Code
(你知道我想成为SEO友好等)。
我确实使用InternalResourceViewResolver
所以我想在我的Controller中使用某种与return "redirect:http://google.com"
类似的代码。
这会发送302 Status Code
我尝试过使用HttpServletResponse
设置标题
@RequestMapping(value="/url/{seo}", method = RequestMethod.GET)
public String detail(@PathVariable String seo, HttpServletResponse response){
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
return "redirect:http://google.com";
}
它仍会返回302
。
在查看文档和Google搜索结果后,我们提出了以下建议:
@RequestMapping(value="/url/{seo}", method = RequestMethod.GET)
public ModelAndView detail(@PathVariable String seo){
RedirectView rv = new RedirectView();
rv.setStatusCode(HttpStatus.MOVED_PERMANENTLY);
rv.setUrl("http://google.com");
ModelAndView mv = new ModelAndView(rv);
return mv;
}
它完全正常并且符合预期,返回代码301
我想在不使用ModelAndView的情况下实现它(尽管它可能非常好)。可能吗?
注意:包含的代码段只是详细信息控制器的一部分,重定向仅在某些情况下发生(支持旧版网址)。
答案 0 :(得分:6)
不确定何时添加,但至少在v4.3.7上有效。您在REQUEST上设置了一个属性,弹出视图代码将其选中:
@RequestMapping(value="/url/{seo}", method = RequestMethod.GET)
public String detail(@PathVariable String seo, HttpServletRequest request){
request.setAttribute(View.RESPONSE_STATUS_ATTRIBUTE, HttpStatus.MOVED_PERMANENTLY);
return "redirect:http://google.com";
}
答案 1 :(得分:3)
我建议使用像你一样的弹簧redirectView。您必须有一个完整的URL,包括域等,以便它可以工作,否则它将执行302.或者如果您有权访问HttpServletResponse,那么您可以执行以下操作。
public void send301Redirect(HttpServletResponse response, String newUrl) {
response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
response.setHeader("Location", newUrl);
response.setHeader("Connection", "close");
}
答案 2 :(得分:2)
如果您已经返回ModelAndView并且不想使用HttpServletResponse,则可以使用此代码段:
Select sum(*) , groupterm from tble group by groupterm