SpringMVCのControllerでURLを厳密に判定する
※利用バージョン 3.0.5.RELEASE
SpringMVCのControllerで以下のRequestMappingを定義すると、
@Controller @RequestMapping("/regist") public class RegistController { @RequestMapping("process") public String process(){ ... } ...
以下のURLが処理される。(下3つは一例)
- http://host/app/regist/process
- http://host/app/regist/process/
- http://host/app/regist/process.do
- http://host/app/regist/process.php
- http://host/app/regist/process.nande.yanen
このように、デフォルトでは、”process/”や”process.*”が処理対象として登録される。(参考:setUseDefaultSuffixPattern)
これを厳密に判定するようにするには、先に書いたsetUseDefaultSuffixPatternをfalseにする必要がある。(デフォルトではtrue)
ここで少しはまった。単純に以下を *-servlet.xml (e.g. spring-servlet.xml)に追加しても有効にならない。
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> <property name="useDefaultSuffixPattern" value="false"/> </bean>
こことか見たら既存の問題かと思ったりしたが、どうも書き方が悪かったらしい。
※依存性やらでエラーになった部分はコメントアウトしている
<!-- <mvc:annotation-driven /> --> <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> <property name="useDefaultSuffixPattern" value="false"/> </bean> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <!-- <property name="webBindingInitializer"> <bean id="webBindingInitializer" class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer"> <property name="validator" ref="validator" /> <property name="conversionService"> <bean class="org.springframework.format.support.FormattingConversionServiceFactoryBean" /> </property> </bean> </property> --> <property name="messageConverters"> <list> <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"></bean> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <property name="writeAcceptCharset" value="false" /> </bean> <bean class="org.springframework.http.converter.ResourceHttpMessageConverter"></bean> <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"></bean> <bean class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter"></bean> <bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter"></bean> <!-- <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean> --> </list> </property> </bean>
これは @PathVariable で、値として最後のピリオド以降が取得できない問題にも対応出来る。
他参考)