springmvcは、アクセスに一致するURLサフィックスを閉じます

現象:

例:添付ファイルをダウンロードする場合は、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の末尾に「/」を追加すると正常にアクセスできる理由です。

 

 

おすすめ

転載: blog.csdn.net/sumengnan/article/details/114035221