13、LIstener和Filter过滤器

JavaWeb 的三大组件。分别是:Servlet 程序、Listener 监听器、Filter 过滤器

一、Listener监听器

  • Listener 监听器它是 JavaWeb 的三大组件之一。JavaWeb 的三大组件分别是:Servlet 程序、Filter 过滤器、Listener 监听器。
  • Listener 它是 JavaEE 的规范,就是接口
  • 监听器的作用是,监听某种事物的变化。然后通过回调函数,反馈给客户(程序)去做一些相应的处理

ServletContextListener监听器

ServletContextListener 它可以监听 ServletContext 对象的创建和销毁。

ServletContext 对象在 web 工程启动的时候创建,在 web 工程停止的时候销毁。监听到创建和销毁之后都会分别调用 ServletContextListener 监听器的方法反馈。

使用 ServletContextListener 监听器监听 ServletContext 对象使用步骤:

1、编写一个类去实现 ServletContextListener
2、实现其两个回调方法
3、到 web.xml 中去配置监听器

监听器实现类:

public class MyServletContextListenerImpl implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("ServletContext对象被创建了");
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("ServletContext对象被销毁了");
    }
}

web.xml中的配置:

<!--配置监听器-->
<listener>
    <listener-class>com.zb.listener.MyServletContextListenerImpl</listener-class>
</listener>

二、Filter过滤器

2.1 Filter简介

  • Filter也称之为过滤器,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
  • Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截,如下所示:

在这里插入图片描述

作用总结:拦截请求,过滤响应

2.2 Filter的使用

Filter 过滤器的使用步骤:

1、编写一个类去实现 Filter 接口
2、实现过滤方法 doFilter()
3、到 web.xml 中去配置 Filter 的拦截路径

代码示例:

要求:在你的 web 工程下,有一个 admin 目录。这个 admin 目录下的所有资源(html 页面、jpg 图片、jsp 文件、等等)都必须是用户登录之后才允许访问。

不使用过滤器的方法:

我们知道,用户登录之后都会把用户登录的信息保存到 Session 域中。所以要检查用户是否登录,可以判断 Session 中否包含有用户登录的信息即可!!!

在这里插入图片描述

使用过滤器的方法:(重点)

Filter 的代码:

public class AdminFilter implements Filter {
   /**
    * doFilter方法,专门用户拦截请求,过滤响应
    * @param servletRequest
    * @param servletResponse
    * @param filterChain
    * @throws IOException
    * @throws ServletException
    */
   @Override
   public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
       HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
       HttpSession session = httpServletRequest.getSession();
       Object user = session.getAttribute("user");
       //如果等于null,说明还没有登录
       if(user == null){
           >servletRequest.getRequestDispatcher("/index.jsp").forward(servletRequest,servletResponse);
           return ;
       }else{
           //让程序继续往下访问用户的目标资源
           filterChain.doFilter(servletRequest,servletResponse);
       }
   }
}

web.xml中的配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee >http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
        version="4.0">
   <!--filter标签用于配置一个Filter过滤器-->
   <filter>
       <!--给filter起一个别名-->
       <filter-name>AdminFilter</filter-name>
       <!--配置filter的全类名-->
       <filter-class>com.zb.filter.AdminFilter</filter-class>
   </filter>
   <!--filter-mapping配置Filter过滤器的拦截路径-->
   <filter-mapping>
       <!--filter-name表示当前的拦截路径给哪个filter使用-->
       <filter-name>AdminFilter</filter-name>
       <!--url-pattern 配置拦截路径
           / 表示请求地址为: http://ip:port/ 工程路径 / 映射到 IDEA 的 web 目录
           /admin/* 表示请求地址为: http://ip:port/ 工程路径 /admin/*
       -->
       <url-pattern>/admin/*</url-pattern>
   </filter-mapping>
</web-app>

2.3 Filter的生命周期

Filter的生命周期包含的方法

1、构造器方法
2、init 初始化方法
	第 1,2 步,在 web 工程启动的时候执行(Filter 已经创建)
3、doFilter 过滤方法
	第 3 步,每次拦截到请求,就会执行
4、destroy 销毁
	第 4 步,停止 web 工程的时候,就会执行(停止 web 工程,也会销毁 Filter 过滤器)

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

Filter的销毁
  Web容器调用destroy方法销毁Filter。destroy方法在Filter的生命周期中仅执行一次。在destroy方法中,可以释放过滤器使用的资源。

2.4 FilterConfig接口

用户在配置filter时,可以使用为filter配置一些初始化参数,当web容器实例化Filter对象,调用其init方法时,会把封装了filter初始化参数的filterConfig对象传递进来。因此开发人员在编写filter时,通过filterConfig对象的方法,就可获得:

  • String getFilterName():得到filter的名称。
  • String getInitParameter(String name): 返回在部署描述中指定名称的初始化参数的值。如果不存在返回null.
  • Enumeration getInitParameterNames():返回过滤器的所有初始化参数的名字的枚举集合。
  • public ServletContext getServletContext():返回Servlet上下文对象的引用。

范例:利用FilterConfig得到filter配置信息:

public class AdminFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

        // 1 、获取 Filter 的名称 filter-name 的内容
        System.out.println("filter-name的值是:"+filterConfig.getFilterName());
        //2 、获取在 web.xml 中配置的 init-param 初始化参数
        System.out.println("初始化参数username的值是:"+filterConfig.getInitParameter("username"));
        System.out.println("初始化参数url的值是:"+filterConfig.getInitParameter("url"));
        //3 、获取 ServletContext 对象
        System.out.println(filterConfig.getServletContext());
    }

    /**
     * doFilter方法,专门用户拦截请求,过滤响应
     * @param servletRequest
     * @param servletResponse
     * @param filterChain
     * @throws IOException
     * @throws ServletException
     */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {
        System.out.println("Filter的destroy方法");
    }
}

web.xml配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <!--filter标签用于配置一个Filter过滤器-->
    <filter>
        <!--给filter起一个别名-->
        <filter-name>AdminFilter</filter-name>
        <!--配置filter的全类名-->
        <filter-class>com.zb.filter.AdminFilter</filter-class>

        <init-param>
            <param-name>username</param-name>
            <param-value>root</param-value>
        </init-param>
        <init-param>
            <param-name>url</param-name>
            <param-value>jdbc:mysql://localhost3306/test</param-value>
        </init-param>

    </filter>
    <!--filter-mapping配置Filter过滤器的拦截路径-->
    <filter-mapping>
        <!--filter-name表示当前的拦截路径给哪个filter使用-->
        <filter-name>AdminFilter</filter-name>
        <!--url-pattern 配置拦截路径
            / 表示请求地址为: http://ip:port/ 工程路径 / 映射到 IDEA 的 web 目录
            /admin/* 表示请求地址为: http://ip:port/ 工程路径 /admin/*
        -->
        <url-pattern>/admin/*</url-pattern>
    </filter-mapping>

</web-app>

2.5 FilterChain过滤器链

web服务器根据Filter在web.xml文件中的注册顺序,决定先调用哪个Filter,当第一个Filter的doFilter方法被调用时,web服务器会创建一个代表Filter链的FilterChain对象传递给该方法。在doFilter方法中,开发人员如果调用了FilterChain对象的doFilter方法,则web服务器会检查FilterChain对象中是否还有filter,如果有,则调用第2个filter,如果没有,则调用目标资源。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.6 Filter的拦截路径

  1. 精确匹配

     <url-pattern>/target.jsp</url-pattern>
     以上配置的路径,表示请求地址必须为:http://ip:port/工程路径/target.jsp
    
  2. 目录匹配

     <url-pattern>/admin/*</url-pattern>
     以上配置的路径,表示请求地址必须为:http://ip:port/工程路径/admin/*
    
  3. 后缀名匹配

     <url-pattern>*.html</url-pattern>
     以上配置的路径,表示请求地址必须以.html 结尾才会拦截到
     <url-pattern>*.do</url-pattern>
     以上配置的路径,表示请求地址必须以.do 结尾才会拦截到
     <url-pattern>*.action</url-pattern>
     以上配置的路径,表示请求地址必须以.action 结尾才会拦截到
     Filter 过滤器它只关心请求的地址是否匹配,不关心请求的资源是否存在!!!
    
  4. 通配符匹配

     <url-pattern>/*</url-pattern>
     拦截所有web资源。
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值