首页 > 解决方案 > Spring Boot 中的过滤器初始化

问题描述

我对 Spring 很陌生,我想将一些旧的 Spring 4 项目迁移到 Spring Boot 2.X。我正面临过滤器初始化的问题。在目前的方法中,我有这样的事情:

public class MyWebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

   @Override
   protected Class<?>[] getRootConfigClasses() { return new Class[]{ Configuration1.class, Configuration2.class, Configuration3.class};}

   @Override
   protected Class<?>[] getServletConfigClasses() { return null; }

   @Override
   @NonNull
   protected String[] getServletMappings() { return new String[]{"/"}; }

   @Override
   public void onStartup(final ServletContext servletContext) throws ServletException {
      super.onStartup(servletContext);

      //MY FILTERS
      FilterRegistration.Dynamic corsFilter = servletContext.addFilter("corsFilter", DelegatingFilterProxy.class);
      corsFilter.addMappingForUrlPatterns(null, false, "/*");
      corsFilter.setAsyncSupported(true);
      //.... more filters there
   }

据我了解,这样做是因为 bean 初始化发生在onStartup方法之后(虽然不确定,如果我错了,请纠正我)。

将应用程序迁移到 Spring Boot 时,onStartup()我将过滤器初始化逻辑复制粘贴到类。ServletContextInitializer不幸的是,我现在在尝试访问调度程序并进一步转发请求时遇到了这样的问题:

public final class MyFilter implements Filter { 
    @Override
   public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
       //some logic
       String servlet = filterConfig.getInitParameter("servlet");
       RequestDispatcher rd = servletContext.getNamedDispatcher(servlet); // null pointer here :(
       rd.forward(new RESTPathServletRequest((HttpServletRequest) request), response);
    }

我的问题如下:

  1. 在 Spring Boot 中使用过滤器的正确方法是什么?
  2. 为什么onStartupin 和 in有ServletContextInitializer不同的流程(看起来 bean 很早就被初始化了)onStartupAbstractAnnotationConfigDispatcherServletInitializer
  3. 有什么方法可以模拟我的本地跑步者的AbstractAnnotationConfigDispatcherServletInitializer逻辑。ServletContextInitializer

标签: springspring-bootservletsservlet-filters

解决方案


推荐阅读