过滤器和监听器

目录

过滤器

        一、过滤器的概述

        二、作用

        三、过滤器的原理

        四、快速入门

         五、过滤器的细节问题

        监听器

                一、监听器的作用

                三、创建监听器的步骤

        示例1:


过滤器

        一、过滤器的概述

java过滤器能够对目标资源的请求和响应进行过滤/拦截。

javaweb 三大组件:servlet , filter , listener

生活中:净水器,空气净化器。。。

java中:登录验证,字符编码处理,敏感字符过滤等

共性特点:过滤的是每一次的请求和响应,意味着每一次的请求和响应一定要先走过滤器!

        二、作用

一般用于完成通过的操作。如:登录过滤,编码处理,敏感字符过滤等。

        三、过滤器的原理

 

        四、快速入门

javaWeb三大组件:servlet (应用程序) , filter (过滤器), listener(监听器)

        3.1 实现接口Filter

        3.2 复写方法      chain.doFilter(req,resp);放行方法

        3.3 配置访问拦截路径

                注解配置

 

                web.xml配置

 <filter>
        <filter-name>Filter</filter-name>
        <filter-class>com.wjk.filter.Filter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>Filter</filter-name>
        <url-pattern>/LifeServlet</url-pattern>
 </filter-mapping>

         五、过滤器的细节问题

  1. web.xml的配置

  2. 过滤器的执行流程

    客户端发出请求----》过滤器----》放行-----》请求的资源----》响应----》过滤器----》客户端

  3. 过滤器的生命周期

    同servlet生命周期:

    init():初始化

    doFilter():放行方法

    destroy():销毁方法 当服务器正常关闭时,执行。

  4. 过滤器配置详解

  •         过滤路径配置
  •         具体的资源路径: /index.jsp 只有访问index.jsp资源时,过滤器才会被执行
  •         拦截目录:/user/* 访问user目录下的所有资源时,过滤器会被执行
  •         后缀名拦截:*.jsp / *.do 访问所有后缀名为.jsp .do时,过滤器会被执行
  •         拦截所有资源: /* 访问所有资源时,过滤器都会被执行
  •         过滤方式配置(资源被访问的方式) 了解
  •         注解:设置dispatcherTypes属性
  •         REQUEST:默认值 浏览器直接请求资源
  •         FORWARD:转发访问资源
  •         INCLUDE:包含访问资源
  •         ERROR:错误跳转资源
  •         ASYNC:异步访问资源

        web.xml配置

<filter>
        <filter-name>FilterDemo1</filter-name>
        <filter-class>com.aaa.bai.filter.FilterDemo1</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>FilterDemo1</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
    </filter-mapping>

        监听器

                一、监听器的作用

        监听你的web应用,监听许多信息的初始化,销毁,增加,修改,删除值等

   Servlet监听器用于监听一些重要事件的发生,监听器对象可以在事情发生前、发生后可以做一些必要的处理

                二、监听器的分类

在一个web应用程序的整个运行周期内,web容器会创建和销毁三个重要的对象,ServletContext,HttpSession,ServletRequest

        按监听的对象划分,可以分为:

                   *ServletContext对象监听器    

                   *HttpSession对象监听器

                   *ServletRequest对象监听器

        按监听的时间划分

                   *对象自身的创建和销毁的监听器

                   *对象中属性的创建和消除的监听器

                   *sessoin中某个对象的状态变化的监听器

                三、创建监听器的步骤

                       注册监听器:

        

<listener>
        <listener-class>com.wjk.listener.Listener</listener-class>
    </listener>

        3.1 上下文监听

@WebListener
public class MyContextListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
//        获取到上下文对象
        ServletContext application = servletContextEvent.getServletContext();
        System.out.println("上下文初始化"+application);
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("上下文销毁");
    }
}

        3.2 session监听

@WebListener
public class MySessionListener implements HttpSessionListener {
    /**
     *
     * @param httpSessionEvent 事件参数,可以获取到被监听对象的数据信息
     */
    @Override
    public void sessionCreated(HttpSessionEvent httpSessionEvent) {
        System.out.println("session创建"+httpSessionEvent.getSession().getId());
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
        System.out.println("session销毁"+httpSessionEvent.getSession());
    }
}

        3.3 session中属性监听

@WebListener
public class MySessionAttributeListener implements HttpSessionAttributeListener {
    @Override
    public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("session属性添加:"+httpSessionBindingEvent.getName());
    }

    @Override
    public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("session属性移除:"+httpSessionBindingEvent.getName());
    }

    @Override
    public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("session属性替换:"+httpSessionBindingEvent.getName());
    }
}

        示例1:

在线人数统计:

1、先获取容器中的数量计数器,如果没有,创建存进去

2、每创建一个session,计数器加1

3、每销毁一个session,计数器减1

@WebListener
public class OnlineListener implements ServletContextListener, HttpSessionListener {
    ServletContext appliction;
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
//        获取上下文对象
         appliction = servletContextEvent.getServletContext();
//         是否有计数器
        if(appliction.getAttribute("count")==null){
//            存进去,只执行一次
            appliction.setAttribute("count",0);
        }
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
    }

    @Override
    public void sessionCreated(HttpSessionEvent httpSessionEvent) {
//        获取原来的计数器的值
       Integer count=Integer.valueOf(appliction.getAttribute("count").toString());
       count++;
//       存进去
       appliction.setAttribute("count",count);
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
        Integer count=Integer.valueOf(appliction.getAttribute("count").toString());
        count--;
        appliction.setAttribute("count",count);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值