如何在没有初始化程序的情况下在 Spring MVC 应用程序中注册 servlet 过滤器

Paf*_*low 2 java spring servlets spring-mvc

我做了一个简单的 servlet 过滤器来减慢我的应用程序的响应速度:

import javax.servlet.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class DelayFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {}

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
        Integer seconds = 10;
        try {
            Thread.sleep(seconds * 1000);
        } catch (InterruptedException e) {
            throw new ServletException("Interrupted!");
        }
        HttpServletResponse response = (HttpServletResponse) resp;
        response.setHeader("Cache-Control", "no-cache, must-revalidate");
        chain.doFilter(req, resp);
    }

    @Override
    public void destroy() {}
}
Run Code Online (Sandbox Code Playgroud)

我读了一堆文章,为应用程序注册它是这样的:在此处输入链接描述 通常有两种注册方法,一种用于使用web.xml,一种用于编程配置。我必须使用的应用程序不使用 XML,但也没有任何初始化程序类。配置是使用 Config Class 完成的,如下所示:

@Configuration
@EnableWebMvc
@EnableAsync
@EnableTransactionManagement
@EnableSpringConfigured
@PropertySource("classpath:config/application.properties")
public class ApplicationConfiguration extends WebMvcConfigurerAdapter {
Run Code Online (Sandbox Code Playgroud)

所以我做了一个初始化程序

导入 javax.servlet.Filter;

public class arachneInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

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

    @Override
    protected Class<?>[] getServletConfigClasses () {
        return new Class<?>[]{ApplicationConfiguration.class};
    }

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

    @Override
    protected Filter[] getServletFilters() {
        return new Filter[] {
            new DelayFilter()
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

我不确定,这是正确的还是会改变我的应用程序的行为方式?乍一看,一切似乎都很正常。 但过滤器不启动!任何想法我做错了什么或建议如何在没有初始化程序的情况下添加过滤器?

编辑:我使用 Spring MVC 4.3.4。

Nov*_*ovy 5

@WebFilter 注解用于在 Web 应用程序中声明过滤器。因此 servlet 容器将在部署时处理您的过滤器,并在我们的示例中关联到指定的 URL (/*)

在此之前,您应该在 web.xml 中执行此操作

@WebFilter(urlPatterns = {"/*"}, description = "My delay filter ")
    public class DelayFilter implements Filter {

        @Override
        public void init(FilterConfig filterConfig) throws ServletException {}

        @Override
        public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
            Integer seconds = 10;
            try {
                Thread.sleep(seconds * 1000);
            } catch (InterruptedException e) {
                throw new ServletException("Interrupted!");
            }
            HttpServletResponse response = (HttpServletResponse) resp;
            response.setHeader("Cache-Control", "no-cache, must-revalidate");
            chain.doFilter(req, resp);
        }

        @Override
        public void destroy() {}
    }
Run Code Online (Sandbox Code Playgroud)

  • 你不想添加任何解释吗?为什么要这样做? (3认同)