zoukankan      html  css  js  c++  java
  • 过滤器与监听器

    1、什么是过滤器?
    过滤器是在执行某个url前所需要做的事情,url可能是某个serlvet所对应的,也有可能是jsp页面

    特点:
    声明式的
    动态的
    灵活的
    模块化的
    可移植的
    可重用的
    透明的

    用处:
    统一的认证处理
    对用户的请求做检查、做更精确的纪录
    监视或对用户所传递的参数做前置处理,如防止数据隐藏码攻击
    改变图像文件的格式
    对响应做编码的动作
    对响应做压缩处理
    对XML的输出使用xslt来转换


    2、过滤器的写法
    1)自定义类,实现javax.servlet.Filter接口
    2)分别实现init(FilterConfig), doFilter(ServletRequest, ServletResponse, FilterChain)
    destroy()
    3)在web.xml中配置该filter
    告诉web容器存在这么一个filter,可以使用<init-param>配置filter的初始化参数,在Filter代码中用FilterConfig对象获取初始化参数

    <filter>
    <filter-name></filter-name>
    <filter-class></filter-class>
    </filter>

    告诉web容器此filter对哪个url进行过滤

    <filter-mapping>
    <filter-name></filter-name>
    <servlet-name></servlet-name> 准确地告诉filter该过滤哪个servlet
    <url-pattern></url-pattern> 可以使用通配符过滤多个servlet
    </filter-mapping>

    3、Filter的生命周期
    *1)init(FilterConfig)初始化方法
    在tomcat容器启动的时候就会对过滤器进行初始化
    2)在执行其过滤的url时,先初始化该url所对应的serlvet
    *3)调用filter的doFilter()方法,进行过滤,使用chain.doFilter传递给下一个过滤器或servlet
    4)执行下一个过滤器的doFilter方法,或者servlet的service方法
    *5)在关闭web容器时,调用 destroy()销毁过滤器

    4、什么是FilterChain?
    FilterChain对象是过滤器链,可以由一个Filter传递到另外的一个Filter,或者直接传递到被过滤的servlet
    如果下一个是过滤器,则传递给过滤器,执行下一个过滤器的doFilter;
    如果下一个是servlet,则传递给servlet。执行此servlet的service方法

    使用FilterChain对象的doFilter()方法进行过滤器链的传递

    doFilter(ServletRequest, ServletResponse), 会把在这里修改的request和response传递给下一个过滤器或者Servlet

    在chain.doFilter前执行的方法叫前置方法
    在chain.doFilter后执行的方法叫后置方法
    filter1执行前置方法,filter1的doFilter到filter2, filter2执行前置方法,filter2的doFilter到servlet,
    servlet执行service方法,
    返回到filter2执行后置方法,
    返回到filter1执行后置方法

    5、过滤器中的执行顺序
    根据web.xml中配置的filter的顺序来执行,如果两个或多个filter最终都是过滤同一个servlet,则按照顺序从上往下执行每个filter

    6、ServletContextListener web上下文监听器
    对部署在tomcat等web容器的应用的初始化和销毁进行监听

    写自己的监听器实现javax.servlet.ServletContextListener接口

    1 contextInitialized(ServletContextEvent sce) // 当web应用初始化时调用 的方法
    2 contextDestroyed(ServletContextEvent sce) // 当tomcat等web容器关闭时调用的方法

    使用情景:访问人数的初始化,web应用的全局配置

    7、javax.servlet.ServletContextAttributeListener 对application(ServletContext) 对象中属性的添加,移除,更新的监听

    attributeAdded(ServletContextAttributeEvent scae)  //添加属性时调用的方法
    attributeRemoved(ServletContextAttributeEvent scae)  //移除属性时调用的方法
    attributeReplaced(ServletContextAttributeEvent scae) // 更新属性时调用的方法

    scae.getName()可以获取到属性的名称
    scae.getValue()获取到属性的值

    8、javax.servlet.http.HttpSessionListener接口 对session创建与销毁的监听
    tomcat容器关闭时产不调用sessionDestroyed(HttpSessionEvent se); 是在session.invalidat()或者timeout
    第一次访问的时候就会创建Session,则会调用sessionCreated(HttpSessionEvent se)。并不是说在request.getSession()时调用

    9、javax.servlet.http.HttpSessionAttributeListener 对session中属性的监听

    1 attributeAdded(HttpSessionBindingEvent se)  //添加属性时调用的方法
    2 attributeRemoved(HttpSessionBindingEvent se)  //移除属性时调用的方法
    3 attributeReplaced(HttpSessionBindingEvent se)  //更新属性时调用的方法

    10、javax.servlet.http.HttpSessionActivationListener
    Activate与Passivate是用于置换对象的动作,当Session对象由于资源利用或负载平衡等原因而必须
    暂时储存至硬盘或其它储存器上时(透过对象序列化),所作的动作称之为Passivate,
    而硬盘或储存器上的Session对象重新加载JVM时所作的动作称之为Activate

    11、javax.servlet.http.HttpSessionBingingListener
    实现了该接口的其他类的对象被添加到session的属性中时或从Session中移除,而调用的

    1 valueBound(HttpSessionBindingEvent event); 该类的对象被添加到session时调用
    2 valueUnbound(HttpSessionBindingEvent event); 该类的对象从session中移除时调用 

    12、javax.servlet.ServletRequestListener
    监听request请求的初始化和销毁

    requestDestroyed(ServletRequestEvent sre)  //请求销毁时调用
    requestInitialized(ServletRequestEvent src)  //请求初始化时调用

    13、javax.servlet.ServletRequestAttributeListener
    当设置属性到request中,或从Request中移除,更新属性所调用的

    1 attributeAdded(ServletRequestAttributeEvent srae) 添加属性时调用的方法
    2 attributeRemoved(ServletRequestAttributeEvent srae) 移除属性时调用的方法
    3 attributeReplaced(ServletRequestAttributeEvent srae) 更新属性时调用的方法

    14、事件对象

    javax.servlet.ServletContextEvent getServletContext();
    javax.servlet.http.HttpSessionEvent getSission();
    javax.servlet.ServletRequestEvent getServletRequest();

    15、java.util.Propertis类的使用
    用于读取.properties文件,根据properties文件中指定的key值获取到对应的value值
    参考WEB-INF目录下test.properties, ConfigUtil.java, PathUtil.java


  • 相关阅读:
    MLE
    AHOI/HNOI2018道路
    AHOI/HNOI2018排列
    推式子
    AHOI/HNOI2018游戏
    ! BJOI2018治疗之雨
    BJOI2018链上二次求和
    BJOI2018双人猜数游戏
    ! BJOI2018染色
    BJOI2018二进制
  • 原文地址:https://www.cnblogs.com/A0926/p/5443836.html
Copyright © 2011-2022 走看看