2(AOP):Filter(实例与讲解)(文末有项目连接)

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包
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容