1:Filter介绍
Filter 过滤器 作用于Controller层请求
Filter 过滤器主要是用来过滤用户请求的,它允许我们对用户请求进行前置处理和后置处理,
比如实现 URL 级别的权限控制、过滤非法请求等等。
Filter 过滤器是面向切面编程——AOP 的具体实现
Filter 是依赖于 Servlet 容器,Filter接口就在 Servlet 包下面,属于 Servlet 规范的一部分。
所以,很多时候我们也称其为“增强版 Servlet”。
2:拦截器代码
Filter类处于Servlet包中 自定义拦截器 只需要实现 Filter的这个三个接口即可
public interface Filter {
//初始化过滤器后执行的操作
default void init(FilterConfig filterConfig) throws ServletException { }
// 对请求进行过滤
void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException;
// 销毁过滤器后执行的操作,主要用户对某些资源的回收
default void destroy() {
}
}
3:Filter是如何实现拦截的
请求流程:
1:用户发送请求到 web 服务器,请求会先到过滤器;
2:过滤器方法前置处理 过滤器会对请求进行一些处理比如过滤请求的参数;
3:filterChain.doFilter(servletRequest, servletResponse) 方法 执行controller 层调用进去后的逻辑
4:过滤器方法后置处理 修改返回给客户端的 response 的内容、判断是否让用户访问该接口等等。
5:用户请求响应完毕,进行一些自己想要的其他操作。
4:使用注解方式 配置自定义拦截器
1:启动类中添加注解
注解讲解
@ServletComponentScan
作用于项目:
Servlet可以直接通过@WebServlet注解自动注册
Filter可以直接通过@WebFilter注解自动注册
Listener可以直接通过@WebListener 注解自动注册
2:使用注解 自定义拦截器类 代码
注解讲解:
@WebFilter将一个实现了javax.servlet.Filte接口的类定义为过滤器
属性filterName声明过滤器的名称,可选
属性urlPatterns指定要过滤 的URL模式,也可使用属性value来声明.(指定要过滤的URL模式是必选属性)
urlPatterns ="/*" 拦截所有请求
urlPatterns = "/api/*" 拦截 /api 路径下的所有请求
(1)通过@WebFilter注解注册的Filter,其加载顺序与执行顺序无关
(2)通过@WebFilter注解注册的Filter,其执行顺序与类名有关,按照类名的字段顺序执行
首字母越小优先级越高 One 中O 小于 Two 中T
(2)通过@WebFilter注解注册的Filter,其加载顺序与注解的filterName值相关
(底层通过HashMap存储,key值即filterName值)
启动时Filter初始化,会把所有的Filter加载到一个HashMap里,然后HashMap会进行重新排序
@Slf4j
@WebFilter(filterName = "MyFilterOne",urlPatterns = "/api/annotation/*")
//@WebFilter(filterName = "MyFilterOne",value = "/api/annotation/*")
public class MyFilterWithAnnotation implements Filter{
@Override
public void init(FilterConfig filterConfig) {
log.info("初始化 注解生成过滤器");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//对请求进行预处理
log.info("注解生成过滤器 开始对请求进行预处理:");
HttpServletRequest request = (HttpServletRequest) servletRequest;
String requestUri = request.getRequestURI();
System.out.println("注解生成过滤器 请求的接口为:" + requestUri);
long startTime = System.currentTimeMillis();
//通过 doFilter 方法实现过滤功能
filterChain.doFilter(servletRequest, servletResponse);
// 上面的 doFilter 方法执行结束后用户的请求已经返回
long endTime = System.currentTimeMillis();
System.out.println("注解生成过滤器 该用户的请求已经处理完毕,请求花费的时间为:" + (endTime - startTime));
}
@Override
public void destroy() {
log.info("销毁 注解生成过滤器");
}
}
5:使用注册方式 配置自定义拦截器
//使用FilterRegistrationBean 注册拦截
// 复制上面的代码但不使用@WebFilter
@Component
@Slf4j
public class MyFilterOne implements Filter {
}
@Configuration
public class MyFilterConfig {
@Autowired
MyFilterOne myFilterOne;
@Bean
public FilterRegistrationBean<MyFilterOne> setUpMyFilterOne() {
FilterRegistrationBean<MyFilterOne> filterRegistrationBean = new FilterRegistrationBean<>();
//setOrder(可以配置顺序)
filterRegistrationBean.setOrder(1);
//注册拦截器
filterRegistrationBean.setFilter(myFilterOne);
//配置拦截路径
filterRegistrationBean.setUrlPatterns(new ArrayList<>(Arrays.asList("/api/*")));
return filterRegistrationBean;
}
}
项目连接
请配合项目代码食用效果更佳:
项目地址:
https://github.com/hesuijin/hesuijin-study-project
Git下载地址:
https://github.com.cnpmjs.org/hesuijin/hesuijin-study-project.git
springboot-filter-interceptor项目模块下 filter包