返回介绍

6.1 Spring Boot 使用过滤器 Filter

发布于 2025-04-26 13:53:50 字数 3450 浏览 0 评论 0 收藏

6.1.1 过滤器 Filter 介绍

Filter 也称为过滤器,是处于客户端与服务器资源文件之间的一道过滤网,它是 Servlet 技术中最激动人心的技术之一。Web 开发人员通过 Filter 技术管理 Web 服务器的所有资源,例如对 JSP、Servlet、静态图片文件或静态 HTML 文件等进行拦截,从而实现一些特殊的功能,如实现 URL 级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。

Filter 接口源代码如下:

     public interface Filter {
        void init(FilterConfig var1) throws ServletException;
        void doFilter(ServletRequest var1, ServletResponse var2,
        FilterChain var3) throws IOException, ServletException;
        void destroy();
     }

Filter 的创建和销毁由 Web 服务器负责。Web 应用程序启动时,Web 服务器将创建 Filter 的实例对象,并调用其 init 方法,读取 web.xml 配置,完成对象的初始化功能,从而为后续的用户请求做好拦截的准备工作(Filter 对象只会创建一次,init 方法也只会执行一次)。开发人员通过 init 方法的参数可获得代表当前 filter 配置信息的 FilterConfig 对象。

当客户请求访问与过滤器关联的 URL 时,过滤器将先执行 doFilter 方法。FilterChain 参数用于访问后续过滤器。Filter 对象创建后会驻留在内存中,当 Web 应用移除或服务器停止时才销毁。在 Web 容器卸载 Filter 对象之前,destroy 被调用。该方法在 Filter 的生命周期中仅执行一次。在这个方法中,可以释放过滤器使用的资源。

Filter 可以有很多个,一个个 Filter 组合起来就形成一个 FilterChain,也就是我们所说的过滤链,如图 6-1 所示。

图 6-1 Filter 链

FilterChain 的执行顺序遵循先进后出的原则:当 Web 客户端发送一个 Request 请求时,这个 Request 请求会先经过 FilterChain,由它利用 dofilter() 方法调用各个子 Filter,至于子 filter 的执行顺序如何,则看客户端是如何制定规则的。当 Request 请求被第一个 Filter 处理之后,又通过 dofilte() 往下传送,被第二个、第三个……Filter 截获处理。当 Request 请求被所有的 Filter 处理之后,返回的顺序是从最后一个开始返回,直到返回给客户端。

6.1.2 过滤器 Filter 的使用

在 Spring Boot 中使用 Filter 过滤器很简单。首先在项目 my-spring-boot 的目录/ src/main/java/com.example.demo.filter 下新建 AyUserFilter.java 类,具体代码如下:

  • @WebFilter:用于将一个类声明为过滤器,该注解将会在应用部署时被容器处理,容器根据具体的属性配置将相应的类部署为过滤器。这样我们在 Web 应用中使用监听器时,不需要在 web.xml 文件中配置监听器的相关描述信息。该注解的常用属性有 filterName、urlPatterns、value 等。filterName 属性用于指定过滤器的 name,等价于 XML 配置文件中的<filter-name>标签。urlPatterns 属性用于指定一组过滤器的 URL 匹配模式,等价于 XML 配置文件中的<url-pattern>标签。value 属性等价于 urlPatterns 属性,但是两者不可以同时使用。

AyUserFilter.java 类开发完成之后,我们需要在入口类 MySpringBootApplication. java 中添加注解 @ServletComponentScan,具体代码如下:

  • @ServletComponentScan:使用该注解后,Servlet、Filter、Listener 可以直接通过 @WebServlet、@WebFilter、@WebListener 注解自动注册,无须其他代码。

事实上,在 Spring Boot 中添加自己的 Servlet、Filter 和 Listener 有两种方法,即代码注册和注解自动注册。上面我们已经讲解了如何用注解自动注册,而代码注册可以通过 ServletRegistrationBean、FilterRegistrationBean 和 ServletListenerRegistrationBean 注册 Bean。虽然条条大路通罗马,但是希望大家先掌握一种方式,一路走到底,而不是纠结于会有几种写法。

6.1.3 测试

6.1.2 节的代码开发完成之后,重新启动运行 my-spring-boot 项目时,Web 容器会初始化 AyUserFilter 对象,并调用 init 方法,可以在 IntelliJ IDEA 控制台看到打印信息,如图 6-2 所示。在浏览器中输入 http://localhost:8080/ayUser/test 访问应用时,AyUserFilter 拦截器会拦截本次的请求,并调用 doFilter 方法,同时会在控制台打印信息,如图 6-3 所示。

图 6-2 初始化调用 init 方法打印信息

图 6-3 拦截调用 doFilter 方法打印信息

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。