在使用SpringBoot 2.x版本時,原有springboot 1.x 版本的通過在表單中添加 input框隱藏域指定_method = put 的方式失效。
雖然瀏覽器傳參的確是帶上了這個參數,但是打斷點會發現服務端依然走的是標注@PostMapping的Controller方法,而不是我們期待的標注@PutMapping的Controller方法,為什么會這樣?
傳統的springMVC中,我們需要在配置文件中添加HiddenHttpMethodFilter配置,就可以支持除get、post以外的http請求方式,比如本案例中的put。
<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>
springboot則對springMVC做了加強改造,很多東西都做了自動配置,是不需要我們自己配置的,xml配置文件更是不需要了。
那么我們來看一看springboot的springMVC模塊的自動配置是怎么處理的。
我們打開WebMvcAutoConfiguration.class這個文件,發現這個類里頭第一個組件就是關於hiddenmethod的配置,spring.mvc.hiddenmethod.filter.enabled默認是個false,在這個方法里new 了一個
OrderedHiddenHttpMethodFilter對象,而OrderedHiddenHttpMethodFilter正是繼承的我們要配置的HiddenHttpMethodFilter。
於是解決辦法就很簡單了,在yml配置文件中配置spring.mvc.hiddenmethod.filter.enabled = ture 即可。
當然我們注意到OrderedHiddenHttpMethodFilter這個組件上還有 @ConditionalOnMissingBean(HiddenHttpMethodFilter.class)
也就是說,如果我們還想進一步擴展,添加一些自定義功能的話,也可以自己寫一個HiddenHttpMethodFilter,並將其加載到spring容器中,就可以覆蓋掉springboot的默認配置了。