2016-01-15 2 views
0

Я использую spring 3.x и tomcat 7 У меня есть контроллер со звездочкой, у которого есть метод, который определяет путь перенаправления. здесь:Избегайте перенаправления 302 по методу запроса контроллера

@RequestMapping(value = "/**/t") 
public class TopCategoryPageController extends AbstractSearchPageController 
{ 
... 
    //@ResponseStatus(HttpStatus.MOVED_PERMANENTLY/* this is 301 */) 
    @RequestMapping(value = TOP_CATEGORY_CODE_PATH_VARIABLE_PATTERN, method = RequestMethod.GET) 
    public String topCategory(@PathVariable("categoryCode") final String categoryCode, final Model model, 
      final HttpServletRequest request, final HttpServletResponse response) 
        throws UnsupportedEncodingException, CMSItemNotFoundException 
    { 
    ... 
    if any redirection 
    { 
     response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY); 
     return redirection; 
    } 
    else 
    return getViewForPage(categoryCode); 
} 

Когда приходит запрос, он выполняет первый topCategory выше метод

Кроме того, у меня есть перехватчик, например, как показано ниже. Он выполняется после метода topCategory, как и ожидалось. Хотя я пытался вставить 301 статус там, я не мог получить то, что хочу.

Здесь:

public class BeforeViewHandlerInterceptor extends HandlerInterceptorAdapter 
{ 
    ... 
    public void postHandle(final HttpServletRequest request, final HttpServletResponse response, final Object handler, 
      final ModelAndView modelAndView) throws Exception 
    { 
    ... 
      if (isRedirectView(modelAndView)) 
     { 
      String uri = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() 
        + request.getContextPath(); 
      uri += modelAndView.getViewName().substring(modelAndView.getViewName().indexOf(":") + 1, 
        modelAndView.getViewName().length()); 
      modelAndView.setViewName("redirect:" + uri); 
      response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY); 
      response.setHeader("Location", response.encodeRedirectURL(uri)); 
     } 
    } 

Neverthless установка 301 статус в postHandle. Он по-прежнему перенаправляется с 302.

Это ссылка, которую я нажал на своей странице: domain/context/t/categoryCode Когда я анализирую вкладку chrome network, я вижу первое перенаправление с 302 с другим инициатором. Второй - 301. Обратите внимание, что мне нужно сделать его перенаправлением вначале 301. Таким образом, я не смог найти место, где он перенаправляет с помощью 302. Thx и brgds

ответ

0

Когда я вставляю код в фрагмент контроллера, как показано ниже, он работает должным образом.

@RequestMapping(value = "/**/t") 
public class TopCategoryPageController extends AbstractSearchPageController 
{ 
... 
    @RequestMapping(value = TOP_CATEGORY_CODE_PATH_VARIABLE_PATTERN, method = RequestMethod.GET) 
    public ModelAndView topCategory(@PathVariable("categoryCode") final String categoryCode, final Model model, 
      final HttpServletRequest request, final HttpServletResponse response) 
        throws UnsupportedEncodingException, CMSItemNotFoundException 
    { 
    ... 
    if any redirection 
    { 
     final RedirectView redirectView = new RedirectView(redirection); 
     redirectView.setStatusCode(HttpStatus.MOVED_PERMANENTLY); 
     return new ModelAndView(redirectView); 
    } 
    else 
     return getViewForPage(categoryCode); 
} 
Смежные вопросы