web-dev-qa-db-ja.com

SpringでWebMvcConfigurerAdapterを使用してフィルターを追加するにはどうすればよいですか?

WebApplicationInitializerを使用すると、onStartup()メソッド内のServletContextにフィルターを簡単に追加できます。

WebMvcConfigurerAdapterでフィルターを追加するにはどうすればよいですか? XMLを使用する必要がありますか?

1を追加

他の人がSpringWeb構成をより簡単に理解できるように、次の図を描きます。

ここで、最初にSpringWeb構成の背後にあるrationalを理解する必要があります。次に、継承する構成クラスとオーバーライドするメソッドを下から選択します。

たくさんのことを覚えるよりも、調べるほうが苦痛は少ないです。

enter image description here

そして、Spring WebInitializationに関する良い記事:

http://www.kubrynski.com/2014/01/understanding-spring-web-initialization.html

2を追加

Tunakiの返信に基づいて、AbstractDispatcherServletInitializerを確認しました。フィルタの登録は、次のコードで行われます。

enter image description here

緑のgetServletFilters()メソッドをオーバーライドしても、registerServletFilter()Dyanmic結果にアクセスできません。では、どうすればaddMappingForUrlPatterns()でフィルターを構成できますか?

_have to_がregisterDispatcherServlet()メソッド全体をオーバーライドしているようです。

7
smwikipedia

WebMvcConfigurerは、_@EnableWebMvc_を介して有効化されたSpringMVCのJavaベースの構成をカスタマイズするために使用されるインターフェースです。 WebMvcConfigurerAdapterは、このインターフェースにデフォルトの空のメソッドを提供する単なるアダプターです。

フィルタが使用されるDispatcherServletは設定されません。そのため、WebMvcConfigurerを使用してサーブレットフィルタを設定することはできません。

フィルタを簡単に設定するには、 AbstractDispatcherServletInitializer から継承し、 getServletFilters() をオーバーライドします。

_public class MyWebAppInitializer extends AbstractDispatcherServletInitializer {

    @Override
    protected Filter[] getServletFilters() {
        return new Filter[] { new CharacterEncodingFilter() };
    }

}
_

フィルタをさらに設定する場合は、代わりに onStartup をオーバーライドする必要があります。

_@Override
public void onStartup(ServletContext servletContext) throws ServletException {
    super.onStartup(servletContext);
    servletContext.addFilter("name", CharacterEncodingFilter.class)
                  .addMappingForUrlPatterns(null, false, "/*");
}
_
13
Tunaki

registerServletFilter()の動的結果には、アプリ構成で次のようにアクセスできます(具体的には、 WebApplicationInitializer )。

@Override
public void onStartup(ServletContext servletContext) throws ServletException {

    // Create the 'root' Spring application context
    AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();

    rootContext.register(
        AppConfig.class,
        SecurityConfiguration.class,
        HibernateConfiguration.class 
    );

    // Add cuatom filters to servletContext
    FilterRegistration.Dynamic filterRegistration = servletContext.addFilter("recaptchaResponseFilter", new RecaptchaResponseFilter());
    filterRegistration.setInitParameter("encoding", "UTF-8");
    filterRegistration.setInitParameter("forceEncoding", "true");
    filterRegistration.addMappingForUrlPatterns(null, true, "/*");

    // Create the dispatcher servlet's Spring application context
    AnnotationConfigWebApplicationContext dispatcherServlet = new AnnotationConfigWebApplicationContext();
    dispatcherServlet.register(MVCConfig.class);

    // Register and map the dispatcher servlet
    ServletRegistration.Dynamic dispatcher = servletContext.addServlet("dispatcher", new DispatcherServlet(dispatcherServlet));
    dispatcher.setLoadOnStartup(1);
    dispatcher.addMapping("/");
1
Psypher

その中にFilterと@InjectServletContextを実装するSpringBeanを作成できます。次に、@ PostConstructメソッドで、それらをservletContext.addServlet( "myFilter"、this);に登録できます。

public class MyFilter implements Filter {
    @Inject
    private ServletContext servletContext;

    @PostConstruct
    public void init(){
        ServletRegistration.Dynamic filter = servletContext.addServlet("myFilter",this);
        filter.addMapping("/myMapping");
    }
}

サーブレット3.0APIはリスナーの動的登録の使用を禁止しているため、ContextLoaderListener(rootContext)で初期化されたrootContextでBeanを宣言しないでください。したがって、DispatcherServlet(dispatcherContext)に与えられるdispatcherContextで宣言する必要があります

public class MyWebAppInitializer implements WebApplicationInitializer {

   @Override
   public void onStartup(ServletContext container) {
     // Create the 'root' Spring application context
     AnnotationConfigWebApplicationContext rootContext =
       new AnnotationConfigWebApplicationContext();
     rootContext.register(AppConfig.class);

     // Manage the lifecycle of the root application context
     container.addListener(new ContextLoaderListener(rootContext));

     // Create the dispatcher servlet's Spring application context
     AnnotationConfigWebApplicationContext dispatcherContext =
       new AnnotationConfigWebApplicationContext();
     dispatcherContext.register(DispatcherConfig.class);

     // Register and map the dispatcher servlet
     ServletRegistration.Dynamic dispatcher =
       container.addServlet("dispatcher", new DispatcherServlet(dispatcherContext));
     dispatcher.setLoadOnStartup(1);
     dispatcher.addMapping("/");
   }

}

春のドキュメント

0
Mirak