2015-02-25 2 views
4

Я пытаюсь перенаправить с 301 Status Code (вы знаете, я хочу быть дружественным к SEO и т. Д.).Перенаправление с 301 статусом в Spring MVC 4 без ModelAndView

Я использую InternalResourceViewResolver, поэтому я хотел использовать какой-то код, похожий на 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 (может быть, это прекрасно, хотя). Является ли это возможным?

ПРИМЕЧАНИЕ: включенные фрагменты - это только части контроллера детали, и перенаправление происходит только в некоторых случаях (поддержка устаревших URL-адресов).

+1

Вы можете напрямую вернуть «RedirectView». –

+0

Мне все равно потребуется изменить тип возвращаемого метода, не так ли? – SirKometa

ответ

2

Я бы предложил использовать 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"); 
    } 
+0

Это не идеальный вариант, но он работает. – SirKometa

+0

Нет причин для 'Connection: close ', если ваша переадресация находится в том же домене. –

+0

Вам также может понадобиться 'response.flushBuffer();' –

1

Не уверен, когда он был добавлен, но по крайней мере на v4.3.7 это работает. Вы можете установить атрибут на запрос, а весной Просмотр кода поднимает его вверх:

@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

Если вы уже вернуть ModelAndView и не хотите использовать HttpServletResponse, вы можете использовать этот фрагмент кода:

 RedirectView rv = new RedirectView("redirect:" + myNewURI); 
     rv.setStatusCode(HttpStatus.MOVED_PERMANENTLY); 
     return new ModelAndView(rv); 
+0

. Все дело в том, что он уже не возвращает ModelAndView и не хочет, поэтому это не отвечает на вопрос. –