WebApplicationInitializer
を使用すると、onStartup()
メソッド内のServletContext
にフィルターを簡単に追加できます。
WebMvcConfigurerAdapter
でフィルターを追加するにはどうすればよいですか? XMLを使用する必要がありますか?
他の人がSpringWeb構成をより簡単に理解できるように、次の図を描きます。
ここで、最初にSpringWeb構成の背後にあるrational
を理解する必要があります。次に、継承する構成クラスとオーバーライドするメソッドを下から選択します。
たくさんのことを覚えるよりも、調べるほうが苦痛は少ないです。
そして、Spring WebInitializationに関する良い記事:
http://www.kubrynski.com/2014/01/understanding-spring-web-initialization.html
Tunaki
の返信に基づいて、AbstractDispatcherServletInitializer
を確認しました。フィルタの登録は、次のコードで行われます。
緑のgetServletFilters()
メソッドをオーバーライドしても、registerServletFilter()
のDyanmic
結果にアクセスできません。では、どうすればaddMappingForUrlPatterns()
でフィルターを構成できますか?
_have to
_がregisterDispatcherServlet()
メソッド全体をオーバーライドしているようです。
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, "/*");
}
_
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("/");
その中に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("/");
}
}