过滤器 Filter是依赖于Servlet容器,属于Servlet规范的一部分,
拦截器则是独立存在的,可以在任何情况下使用。
文章目录
- Filter 过滤器
-
- FilterRegistrationBean方式注册
-
- 1. 实现 Filter 接口,编写过滤器
- 2. 注册过滤器
-
- FilterRegistrationBean实例 注册过滤器
- @WebFilter注解 注册过滤器
- Interceptor 拦截器
-
- 实现 HandlerInterceptor 接口,编写拦截器
- 注册拦截器
Filter 过滤器
- 有2种方式可以实现过滤器
- 通过FilterRegistrationBean实例注册
- 通过@WebFilter注解生效(不能设置过滤器之间的优先级)
FilterRegistrationBean方式注册
1. 实现 Filter 接口,编写过滤器
public class Test1Filter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
throws IOException, ServletException {
HttpServletRequest request=(HttpServletRequest)arg0;
System.out.println("自定义过滤器filter1触发,拦截url:"+request.getRequestURI());
arg2.doFilter(arg0,arg1);
}
@Override
public void destroy() {
}
}
2. 注册过滤器
FilterRegistrationBean实例 注册过滤器
@Configuration
public class testFilterConfig {
@Bean
public FilterRegistrationBean<Test1Filter> RegistTest1(){
FilterRegistrationBean<Test1Filter> bean = new FilterRegistrationBean<Test1Filter>();
bean.setFilter(new Test1Filter());//注册自定义过滤器
bean.setName("flilter1");//过滤器名称
bean.addUrlPatterns("/*");//过滤所有路径
//通过FilterRegistrationBean实例设置优先级可以生效 通过@WebFilter无效
bean.setOrder(1);//优先级,最顶级
return bean;
}
}
@WebFilter注解 注册过滤器
直接在Test1Filter 类上加
@WebFilter(urlPatterns = "/*", filterName = "Test1Filter1")
就注册生效
- @WebFilter这个注解是Servlet3.0的规范,并不是Spring boot提供的
- @WebFilter这个注解并没有指定执行顺序的属性,其执行顺序依赖于Filter的名称,是根据Filter类名(注意不是配置的filter的名字)的字母顺序倒序排列
- 过滤器优先级都高于FilterRegistrationBean配置的过滤器
Interceptor 拦截器
实现 HandlerInterceptor 接口,编写拦截器
public class Test1CostInterceptor implements HandlerInterceptor {
long start = System.currentTimeMillis();
//请求执行前执行
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
System.out.println("自定义拦截器触发,请求开始");
return true;
}
//请求结束执行
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
System.out.println("自定义拦截器触发,请求结束");
}
//视图渲染完成后执行
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
}
}
注册拦截器
@Configuration
public class InterceptorConfig extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new Test1CostInterceptor()).addPathPatterns("/**");
super.addInterceptors(registry);
}
}