2016-12-12 10 views
0

Я пытаюсь использовать HiddenHttpMethodFilter, чтобы мое приложение Spring MVC обрабатывало PUT и DELETE запросов. Вот часть моего web.xml с фильтрами:HttpHiddenMethodFilter вызывает двойную проверку токена csrf

<filter> 
<filter-name>httpMethodFilter</filter-name> 
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> 
</filter> 

<filter-mapping> 
<filter-name>httpMethodFilter</filter-name> 
<url-pattern>/*</url-pattern> 
</filter-mapping> 

<filter> 
<filter-name>springSecurityFilterChain</filter-name> 
<filter-class>org.springframework.web.filter.DelegatingFilterProxy 
</filter-class> 
</filter> 

<filter-mapping> 
<filter-name>springSecurityFilterChain</filter-name> 
<url-pattern>/*</url-pattern> 
</filter-mapping> 

Но эта конфигурация вызывает запросы двойной проверки. Например. Я отправить PUT запрос, то я вижу в отладчик, который HiddenHttpMethodFilter был фактически выполнен, и способ управления успешно выполняет обновление и возвращает 200, но где-то в DispatcherServlet или FrameworkServlet возвращает следующую ошибку:

HTTP Status 405 - Request method 'PUT' not supported

I can see that method was executed in debugger only; "Network" tab shows 405 only

Возможно, фильтры установлены неправильно? Как избежать двойной фильтрации?

Вероятно код метода контроллера будет уточнить: л

@RequestMapping(method = RequestMethod.PUT, value = "/update") 
public ModelAndView update(@ModelAttribute("entity") @Valid Entity entity) { 
    ModelAndView model = new ModelAndView(); 
    service.update(entity); 
    model.setViewName("/blog/success"); 
    model.addObject("record", entity); 
    return model; 
} 
+0

Это не имеет ничего общего с двойной фильтрацией. Вы должны перенаправить после PUT, когда ваш метод будет выполняться по умолчанию, он отправит его в JSP. JSP, как правило, работает только с GET и POST, и ничего больше. –

+0

@ M.Deinum, извините, но я не уверен, что понял смысл. Я обновил вопрос, добавив метод контроллера в конце. Не могли бы вы предложить, что именно я должен изменить? –

+0

Как указано, запрос передается вашему представлению в виде запроса PUT вместо запроса GET. Вы не можете сделать JSP с PUT. –

ответ

0

Да, решение, описанное в комментариях выше было полезно, действительно. Я изменил свой метод контроллера из представления рендеринга для перенаправления следующим образом:

@RequestMapping(method = RequestMethod.PUT, value = "/update") 
public String update(@ModelAttribute("entity") @Valid Entity entity) { 
      service.update(entity); 
      return "redirect:desiredMethod"; 
//desiredMethod is GET method that renders needed page 
     } 

и теперь он работает правильно!