1. 过滤器与拦截器的区别
- 过滤器(Filter):
- 能获取http请求和响应信息,
- 无法获取处理请求方法的信息
- 是Servlet规范定义的,应用于web应用
- 拦截器(Interceptor):
- HandlerInterceptor能获取http请求和响应信息,也能获取处理请求方法的信息
- 拦截器不仅仅可以应用于web应用
- 拦截器属于Spring框架支持的
总结
- Filter被Tomcat调用,Interceptor被spring调用,所以Filter优先于Interceptor执行
- 过滤器能做的事情,拦截器都能做,而且拦截器更灵活
2. 在springboot的web工程中添加过滤器
2.1 创建一个自定义的过滤器类
package com.example.filter;
import javax.servlet.*;
import java.io.IOException;
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("过滤器前置处理");
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("过滤器后置处理");
}
}
2.2 创建一个配置类,将过滤器添加到容器中
package com.example.config;
import com.example.filter.MyFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.servlet.Filter;
@Configuration
public class MyFilterConfig {
//这种方式向容器中添加过滤器可以实现拦截路径定义和优先级
@Bean
public FilterRegistrationBean filterRegistration() {
FilterRegistrationBean registrationBean = new FilterRegistrationBean(new MyFilter());
registrationBean.addUrlPatterns("/*");
registrationBean.setOrder(1);
return registrationBean;
}
//可以直接向容器中放入过滤
@Bean
public Filter filter() {
return new MyFilter();
}
}
- ?直接向容器中添加过滤器,无法控制拦截路径和优先级
至此,整合过滤器逻辑完成
|