在没有 ModelAndView 的 Spring MVC 4 中以 301 状态重定向
Redirect with 301 status in Spring MVC 4 without ModelAndView
我尝试使用 301 Status Code
进行重定向(你知道我想要对 SEO 友好等)。
我确实使用了 InternalResourceViewResolver
,所以我想在我的控制器中使用类似于 return "redirect:http://google.com"
的某种代码。
这虽然会发送 302 Status Code
我尝试过使用 HttpServletResponse
来设置 header
@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";
}
它仍然 return 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;
}
它确实工作得很好,正如预期的那样,returning 代码 301
我想在不使用 ModelAndView 的情况下实现它(也许它非常好)。是否可以?
注意:包含的片段只是详细信息控制器的一部分,重定向只在某些情况下发生(支持旧版 URL)。
我建议像您一样使用 spring 的 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");
}
不确定何时添加,但至少在 v4.3.7 上有效。您在 REQUEST 上设置了一个属性,spring 查看代码将其拾取:
@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";
}
如果您已经 return 一个 ModelAndView 并且不想使用 HttpServletResponse,您可以使用此代码段:
RedirectView rv = new RedirectView("redirect:" + myNewURI);
rv.setStatusCode(HttpStatus.MOVED_PERMANENTLY);
return new ModelAndView(rv);
我尝试使用 301 Status Code
进行重定向(你知道我想要对 SEO 友好等)。
我确实使用了 InternalResourceViewResolver
,所以我想在我的控制器中使用类似于 return "redirect:http://google.com"
的某种代码。
这虽然会发送 302 Status Code
我尝试过使用 HttpServletResponse
来设置 header
@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";
}
它仍然 return 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;
}
它确实工作得很好,正如预期的那样,returning 代码 301
我想在不使用 ModelAndView 的情况下实现它(也许它非常好)。是否可以?
注意:包含的片段只是详细信息控制器的一部分,重定向只在某些情况下发生(支持旧版 URL)。
我建议像您一样使用 spring 的 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");
}
不确定何时添加,但至少在 v4.3.7 上有效。您在 REQUEST 上设置了一个属性,spring 查看代码将其拾取:
@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";
}
如果您已经 return 一个 ModelAndView 并且不想使用 HttpServletResponse,您可以使用此代码段:
RedirectView rv = new RedirectView("redirect:" + myNewURI);
rv.setStatusCode(HttpStatus.MOVED_PERMANENTLY);
return new ModelAndView(rv);