2016-05-12 96 views
3

我想在春天301重定向,所以這裏的一段代碼,我用HTTP重定向:301(永久)與302(臨時)春季

@RequestMapping(value = { "/devices" } , method = RequestMethod.GET) 
    private String initGetForm(@ModelAttribute("searchForm") final SearchForm searchForm, 
          BindingResult result, 
          HttpServletRequest request, 
          HttpServletResponse response, 
          Model model, Locale locale) throws Exception { 


     String newUrl = "/devices/en"; 

     response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY); 
     response.setHeader("Location", newUrl); 
     response.setHeader("Connection", "close"); 

     return "redirect:" + newUrl; 

} 

但檢查IE開發工具我得到了這個狀態302移動暫時

+2

因爲你正在返回'redirect:+ newUrl',這基本上呈現你在做那些無用之前所做的所有事情。不要返回任何東西,返回void。 –

回答

5

Spring處理重定向時會重置您的響應頭,因爲您正在返回具有特殊重定向前綴的邏輯視圖名稱。如果要手動設置標頭,而不使用Spring視圖解析度,則自己處理響應。更改您的代碼如下

@RequestMapping(value = { "/devices" } , method = RequestMethod.GET) 
private void initGetForm(@ModelAttribute("searchForm") final SearchForm searchForm, 
           BindingResult result, 
           HttpServletRequest request, 
           HttpServletResponse response, 
           Model model, Locale locale) throws Exception { 

      String newUrl = request.getContextPath() + "/devices/en"; 
      response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY); 
      response.setHeader("Location", newUrl); 
      response.setHeader("Connection", "close"); 

    } 
4

您可以使用RedirectViewTEMPORARY_REDIRECT狀態。

@RequestMapping(value = { "/devices" } , method = RequestMethod.GET) 
private ModelAndView initGetForm(@ModelAttribute("searchForm") final SearchForm searchForm, 
          BindingResult result, 
          HttpServletRequest request, 
          HttpServletResponse response, 
          Model model, Locale locale) throws Exception { 
    .... 
    RedirectView redirectView = new RedirectView(url); 
    redirectView.setStatusCode(HttpStatus.TEMPORARY_REDIRECT); 
    return new ModelAndView(redirectView); 
}