三种添加方式
1 实现Filter 添加@Component注解,此方式过滤所有url,可以在代码中判断过滤那些
@Component
@Order(1) //优先级,最顶级
public class TimeFilter implements Filter {
@Override
public void destroy() {
System.out.println("time filter destroy");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("time filter start");
long start = new Date().getTime();
String url = request.getRequestURL().toString();
if (url.contains("XXX")) {
//过滤逻辑
......
} else {
//不过滤
filterChain.doFilter(servletRequest, servletResponse);
}
chain.doFilter(request, response);
System.out.println("time filter 耗时:"+ (new Date().getTime() - start));
System.out.println("time filter finish");
}
@Override
public void init(FilterConfig arg0) throws ServletException {
System.out.println("time filter init");
}
}
2 @Configuration 配置类中通过 FilterRegistrationBean 注册 ,可以配置过滤url 、配置优先级
@Configuration
public class WebConfig {
@Bean
public FilterRegistrationBean timeFilter() {
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
TimeFilter timeFilter = new TimeFilter();
registrationBean.setFilter(timeFilter);
List<String> urls = new ArrayList<>();
urls.add("/*"); // 可以配置过滤url
registrationBean.setUrlPatterns(urls);
registrationBean.setOrder(1);//优先级,最顶级
return registrationBean;
}
}
3 通过 @WebFilter 添加过滤器,可以配置过滤url 、配置优先级
@WebFilter(urlPatterns = "/*") //可以配置过滤url
@Order(1) //优先级,最顶级
public class TimeFilter implements Filter {
@Override
public void destroy() {
System.out.println("time filter destroy");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("time filter start");
long start = new Date().getTime();
chain.doFilter(request, response);
System.out.println("time filter 耗时:"+ (new Date().getTime() - start));
System.out.println("time filter finish");
}
@Override
public void init(FilterConfig arg0) throws ServletException {
System.out.println("time filter init");
}
}
- 切片 拿不到原始的 HTTP请求参数,可以拿到被切片控制器的 方法 参数 ,可以拿到参数值
- 过滤器 可以拿到原始的 http请求,拿不到 被过滤的 控制器 方法 参数
- 拦截器 拿不到原始的 HTTP请求参数,可以拿到被拦截的控制器的 方法 参数,但是拿不到 参数值