在没有 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);