現象:
例:添付ファイルをダウンロードする場合は、URL / affix / xxx / downloadにアクセスできます。インターフェイスは次のとおりです。
@RequestMapping(value = {"/affix/{encryptionId}/download"}, method = {RequestMethod.GET})
public void download(@PathVariable String encryptionId, HttpServletRequest request, HttpServletResponse response) {
//xxx
}
ただし、/ affix / xxx / downloadにアクセスして.xxxのサフィックスを追加すると、ダウンロードすることもできます。たとえば、次の場所にアクセスします:/affix/xxx/download.exe
どうしてこれなの?このハンドラーが一致するのはなぜですか?
理由:
ソースコードを詳しく調べてみると、springmvcは、プロセッサマッパーを取得する段階でユーザーが要求したURLに従って、対応するHandlerMappingを見つけることがわかりました。
検索時に、PatternsRequestConditionクラスを介してURLのサフィックス(デフォルトで有効)と一致します。URLに小数点がある場合、ハンドラーと正常に一致します(プロセスは/ affix / xxx / downloadを使用します)。 *リクエストに一致する/affix/xxx/download.exe )
SpringMVCワークフローリファレンス:https ://blog.csdn.net/sumengnan/article/details/105381225
解決:
間違ったアプローチ:
最初に、カスタムクラスからWebMvcConfigurationSupportクラスを継承し、requestMappingHandlerMappingメソッドをオーバーライドして、UseSuffixPatternMatch値をfalseに設定しました。
@Configuration
public class MyWebMvcConfiguration extends WebMvcConfigurationSupport {
@Override
public RequestMappingHandlerMapping requestMappingHandlerMapping() {
RequestMappingHandlerMapping handlerMapping = super.requestMappingHandlerMapping();
handlerMapping.setUseSuffixPatternMatch(false);//设置禁止url后缀匹配
return handlerMapping;
}
}
ピットを踏む:
環境がspringbootであり、WebMvcConfigrutionSupportクラスを継承するメソッドが採用されている場合。
後で、springboot自動構成クラスWebMvcAutoConfigurationに@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)アノテーションがあるため、springbootが自動的に構成しないことが発見されました。また、ResourceHandlersなどのさまざまなコンポーネントを手動で構成する必要があります。そうしないと、静的リソースにアクセスする場合は404。
正しい方法:
WebMvcConfigurerAdapterを継承する必要があります(ただし、古くなって使用することはできます)、またはWebMvcConfigurerインターフェイスを実装することは同じです
@Configuration
public class JswWebMvcConfiguration extends WebMvcConfigurerAdapter {
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
configurer.setUseSuffixPatternMatch(false);//设置禁止url后缀匹配
}
}
関連:
同様に、末尾の「/」を照合するために使用されるuseTrailingSlashMatch属性があります。
これが、URLの末尾に「/」を追加すると正常にアクセスできる理由です。