2016-12-12 8 views
0

HiddenHttpMethodFilterを使用して、Spring MVCアプリケーションがPUTおよびDELETEリクエストを処理できるようにしようとしています。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> 

ただし、この設定ではリクエストが再確認されます。例えば。

HTTP Status 405 - Request method 'PUT' not supported

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

:私は HiddenHttpMethodFilterが実際に実行され、コントローラのメソッドが正常に更新を実行し、 200を返し、その後のどこかのDispatcherServletまたはFrameworkServletそれは次のエラーを返した PUT要求、その後、私は、デバッガに表示を送信します

おそらく、私のフィルタは正しく設定されていませんか?どのようにダブルフィルタリングを避けることができますか?

おそらくコントローラメソッドのコードは、なめらかを明らかにする:

@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

前述のように、リクエストはGETリクエストではなくPUTリクエストとしてビューに渡されます。 PUTを使ってJSPをレンダリングすることはできません。 –

答えて

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 
     } 

これで正しく動作しました。

関連する問題