(六)Spring Boot 使用过滤器和监听器 —— 《一步一步学 Spring Boot 2》读书笔记

本文纯个人读书笔记,书籍《一步一步学 Spring Boot 2》
如果喜欢,可直接购买书籍。如有侵权,请联系删除

一、使用过滤器

1.过滤器

过滤器 Filter 是 Servlet 技术之一,通过 Filter 技术,可以对 Web 服务器管理的资源:如 Jsp、Servlet、静态图片文件或静态 htm l文件等进行拦截,从而实现一些特殊的功能。例如实现 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 方法,Filter 对象只会创建一次,init 方法也只会执行一次。在 Web 应用程序停止时,将销毁 Filter 实例对象,并调用 destroy 方法,在这个方法中,可以释放过滤器使用的资源。

当请求访问与过滤器关联的 URL 的时候,过滤器将先执行 doFilter 方法。Filter 可以是有很多个,多个 Filter 组合成起来,就形成了一个过滤器链 FilterChain。
在这里插入图片描述

2.Spring Boot 使用过滤器

在 Spring Boot 中使用过滤器非常简单,我们新建一个过滤器 com.xiaoyue.demo.filter.UserFilter。

UserFilter.java:

@WebFilter(filterName = "userFilter", urlPatterns = "/*")
public class UserFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("111 zx init");
    }

    @Override
    public void doFilter(ServletRequest servletRequest,
                         ServletResponse servletResponse,
                         FilterChain filterChain) throws IOException, ServletException {

        System.out.println("111 zx doFilter");
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {

        System.out.println("111 zx destroy");
    }
}

在这边,我们使用 @WebFilter 来声明过滤器,该注解将会在应用部署时被容器处理,容器根据具体的属性配置将相应的类部署为过滤器。该注解的常用属性有:filterName、urlPatterns、value 等。

filterName 属性用于指定过滤器的 name,等价于 XML 配置文件中的标签。
urlPatterns 属性用于指定一组过滤器的 URL 匹配模式,等价于 XML 配置文件中的标签。
value 属性等价于 urlPatterns 属性,但是两者不可以同时使用。

在入口类 DemoApplication.java 中添加注解 @ServletComponentScan。使用该注解,Servlet、Filter、Listener 可以直接通过 @WebServlet、@WebFilter、@WebListener 注解自动注册,无需其它代码。

DemoApplication.java:

@SpringBootApplication
@ServletComponentScan
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}

3.测试

运行项目,访问项目随便一个地址,查看过滤器的日志。

启动时候的日志打印。
在这里插入图片描述
访问 http://localhost:8080/demo/user/list 的日志打印。
在这里插入图片描述

注: 当有多个过滤器时候,过滤器执行的先后顺序与系统有关,在 Windows 本地 tomcat 服务器上,优先级只参考 filer 名字的第一个字母在字母表的顺序,靠前的优先级高,不区分大小写。如名为 A、b、C、D 四个 filter 的优先级为 A>b>C>D。其他系统未尝试。

二、使用监听器

1.监听器

Servlet 监听器 Listener,可以用于监听 Web 应用中某些对象、信息的创建、销毁、增加,修改,删除等动作的发生,然后作出相应的响应处理。
当范围对象的状态发生变化的时候,服务器自动调用监听器对象中的方法。常用于统计在线人数和在线用户,系统加载时进行信息初始化,统计网站的访问量等等。

根据监听对象,可把监听器分为 3 类:ServletContext(对应application)、HttpSession(对应session)、ServletRequest(对应request)。

Application 在整个 Web 服务中只有一个,在 Web 服务关闭时销毁。
Session 对应每个会话,在会话起始时创建,一端关闭会话时销毁。
Request 对象是客户发送请求时创建的(一同创建的还有Response),用于封装请求数据,在一次请求处理完毕时销毁。

根据监听事件分为:监听对象创建与销毁,如:ServletContextListener、监听对象域中属性的增加和删除,如:HttpSessionListener 和 ServletRequestListener、监听绑定到 Session 上的某个对象的状态,如ServletContextAttributeListener,HttpSessionAttributeListener,ServletRequestAttributeListener 等。

2.Spring Boot 使用监听器

在 Spring Boot 中使用监听器与使用过滤器一样,我们新建一个监听器 com.xiaoyue.demo.listener.UserListener。

UserListener.java:

@WebListener
public class UserListener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent sce) {

        System.out.println("111 zx UserListener contextInitialized");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {

        System.out.println("111 zx UserListener contextDestroyed");
    }
}

跟过滤器类似,使用 @WebListener 声明一个监听器,该注解将会在应用部署时被容器处理,容器根据具体的属性配置将相应的类部署为监听器。

ServletContextListener 类: 能够监听 ServletContext 对象的生命周期,实际上就是监听 Web 应用的生命周期。当 Servlet 容器启动或终止 Web 应用时,会触发 ServletContextEvent 事件,该事件由 ServletContextListener 类来处理。在 ServletContextListener 接口中定义了处理 ServletContextEvent 事件的两个方法:contextInitialized和contextDestroyed。

contextInitialized:当 Servlet 容器启动 Web 应用时调用该方法。在调用完该方法之后,容器再对 Filter 初始化,
	并且对那些在 Web 应用启动时就需要被初始化的Servlet 进行初始化。
	
contextDestroyed:当 Servlet 容器终止 Web 应用时调用该方法。
	在调用该方法之前,容器会先销毁所有的 Servlet 和 Filter 过滤器。

同样需要在入口类 DemoApplication.java 中添加注解 @ServletComponentScan,这个在上面已经添加成功,这边就不再进行添加。

3.测试

重新部署项目,会先执行 ServletContextListener 的 contextInitialized 方法,再执行 Filter 的 init 方法。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值