我制作了一个简单的 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() {}
}
我阅读了一堆文章来为这样的应用程序注册它:enter link description here 通常有两种注册方式,一种是使用web.xml,一种是编程配置。我必须使用的应用程序不使用 XML,但也没有任何初始化程序类。配置是用这样一个配置类开始的:
@Configuration
@EnableWebMvc
@EnableAsync
@EnableTransactionManagement
@EnableSpringConfigured
@PropertySource("classpath:config/application.properties")
public class ApplicationConfiguration extends WebMvcConfigurerAdapter {
所以我做了一个初始化
导入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()
};
}
}
我不确定这是否正确,或者它会改变我的应用程序的行为方式吗?乍一看,一切似乎都很正常。 但是过滤器没有启动!有什么想法我做错了什么或建议我如何在没有初始化程序的情况下添加过滤器?
编辑:我使用 Spring MVC 4.3.4。
最佳答案
@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() {}
}
关于java - 如何在没有 Initializer 的情况下在 Spring MVC 应用程序中注册 servlet 过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47794773/