• 过滤器Filter/监听器Listener


    目录

    Filter是什么?

    在xml里注册filter

    初始化:

    主要过滤请求的方法:(核心)

    监听器 listener

    JavaEE(servlet)三大件

    监听器的分类

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

    监听域对象中属性的增加和删除

    监听绑定到session中的某个对象的状态的事件监听

    配置监听器


    Filter是什么?

    1、JavaWEB的一个重要组件,可以对发送到servlet的请求进行拦截过滤,也可以对响应进行拦截。
    2、Filter是实现了Filter接口的Java类
    3、Filter需要在web.xml中进行注册,也可以通过注解来注册。
    怎么创建一个Filter一只需要创建的一个类,实现Filter接口并重写方法即可。

    @WebServlet("/uu.do")----对那个进行拦截如果要对所有进行拦截:("/*")

    1. @WebServlet("/uu.do")
    2. public class Hello implements Filter {
    3. //初始化
    4. @Override
    5. public void init(FilterConfig filterConfig) throws ServletException {
    6. Filter.super.init(filterConfig);
    7. }
    8. //主要过滤请求的方法
    9. @Override
    10. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    11. }
    12. //销毁
    13. @Override
    14. public void destroy() {
    15. Filter.super.destroy();
    16. }
    17. }

    这就是一个生命周期:初始化/过滤请求/销毁

    在xml里注册filter

    1. <filter>
    2. <filter-name>u</filter-name>
    3. <filter-class>UserNameFilter</filter-class>
    4. </filter>
    5. <!-- 配置过滤器过滤拦截什么请求-->
    6. <filter-mapping>
    7. <filter-name>u</filter-name>
    8. <!-- //对什么请求进行过滤-->
    9. <url-pattern>/uu.do</url-pattern>
    10. </filter-mapping>

    初始化:

    在创建Filter对象的时候,在servlet容器里(tomcat),加载当前web应用(当前工程)被调用只执行一次,当前Filter的初始化请求。Filter和servlet都是单例的。FilterConfig类似于ServletConfig,获取初始化参数

    主要过滤请求的方法:(核心)

    真正Filter要处理的逻辑代码需要写在此方法里,每次拦截都会调用这个方法。

    ServletRequest:实际上当请求来的时候,实例化的还是HTTPServletRequest

    ServletResponse:实际上当请求来的时候,实例化的还是HTTPServletResponse

    FilterChain:过滤器链,一个项目中可以有多个过滤器,既然有多个,就会产生顺序,有顺序,就形成了链,把当前请求传给下一个

    Filter顺序: 跟web.xml里的filter-mapping的顺序有关

    过滤请求已经通过方法捕获到了,但是不能说,捕获到就不走了,我们是要进行判定等操作,如果条件允许,我们还是会让他通过的:

    我们看到doFilter方法里,有三个参数,前两个咱们都认识,那第三个呢,欸,我们传输就用第三个参数:

    filterChain.doFilter(servletRequest,servletResponse);

    这就是传输给下一位,我的理解就是给他个通行证,让方法放行。

    监听器 listener

    专门用于对其他对象身上发生的事件或状态改变进行监听和相应的处理

    主要监听作用域的对象的改变

    监听器监听的是域对象,不是监听对象的某个地址

    JavaEE(servlet)三大件

    servlet、filter、listener

    监听器的分类

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

    1. public class HelloListener implements HttpSessionListener, ServletRequestListener, ServletContextListener {
    2. @Override
    3. public void contextInitialized(ServletContextEvent sce) {
    4. ServletContextListener.super.contextInitialized(sce);
    5. }
    6. @Override
    7. public void contextDestroyed(ServletContextEvent sce) {
    8. ServletContextListener.super.contextDestroyed(sce);
    9. }
    10. @Override
    11. public void requestDestroyed(ServletRequestEvent sre) {
    12. ServletRequestListener.super.requestDestroyed(sre);
    13. }
    14. @Override
    15. public void requestInitialized(ServletRequestEvent sre) {
    16. ServletRequestListener.super.requestInitialized(sre);
    17. }
    18. @Override
    19. public void sessionCreated(HttpSessionEvent se) {
    20. HttpSessionListener.super.sessionCreated(se);
    21. }
    22. @Override
    23. public void sessionDestroyed(HttpSessionEvent se) {
    24. HttpSessionListener.super.sessionDestroyed(se);
    25. }
    26. }

    监听域对象中属性的增加和删除

    1. @WebListener
    2. public class HelloAttributeListener implements ServletContextAttributeListener, ServletRequestAttributeListener, HttpSessionAttributeListener {
    3. @Override
    4. public void attributeAdded(ServletContextAttributeEvent scae) {
    5. ServletContextAttributeListener.super.attributeAdded(scae);
    6. }
    7. @Override
    8. public void attributeRemoved(ServletContextAttributeEvent scae) {
    9. ServletContextAttributeListener.super.attributeRemoved(scae);
    10. }
    11. @Override
    12. public void attributeReplaced(ServletContextAttributeEvent scae) {
    13. ServletContextAttributeListener.super.attributeReplaced(scae);
    14. }
    15. @Override
    16. public void attributeAdded(ServletRequestAttributeEvent srae) {
    17. ServletRequestAttributeListener.super.attributeAdded(srae);
    18. }
    19. @Override
    20. public void attributeRemoved(ServletRequestAttributeEvent srae) {
    21. ServletRequestAttributeListener.super.attributeRemoved(srae);
    22. }
    23. @Override
    24. public void attributeReplaced(ServletRequestAttributeEvent srae) {
    25. ServletRequestAttributeListener.super.attributeReplaced(srae);
    26. }
    27. @Override
    28. public void attributeAdded(HttpSessionBindingEvent se) {
    29. HttpSessionAttributeListener.super.attributeAdded(se);
    30. }
    31. @Override
    32. public void attributeRemoved(HttpSessionBindingEvent se) {
    33. HttpSessionAttributeListener.super.attributeRemoved(se);
    34. }
    35. @Override
    36. public void attributeReplaced(HttpSessionBindingEvent se) {
    37. HttpSessionAttributeListener.super.attributeReplaced(se);
    38. }
    39. }

    监听绑定到session中的某个对象的状态的事件监听

    1. public class HelloSessionListener implements HttpSessionActivationListener {
    2. //在钝化之前被调用
    3. @Override
    4. public void sessionWillPassivate(HttpSessionEvent se) {
    5. HttpSessionActivationListener.super.sessionWillPassivate(se);
    6. }
    7. //在活化之后被调用
    8. @Override
    9. public void sessionDidActivate(HttpSessionEvent se) {
    10. HttpSessionActivationListener.super.sessionDidActivate(se);
    11. }
    12. }

    活化:从磁盘中读取session对象

    钝化:向磁盘中写入session对象

    @WebListener注解加上以后才可以监听域对象

    配置监听器

    注解:@WebListener

    xml配置:

            afternoon.listener.HelloListener

  • 相关阅读:
    Espresso Test 2: Espresso_simple
    java.util.IllegalFormatConversionException: f != java.lang.String 问题解决!
    Redis的Cluster集群数据倾斜
    【LeetCode刷题(数据结构与算法)】:合并两个有序链表
    关于时序预测可解释性预测
    产品经理进阶:阻碍产品上市的5个因素
    鸿蒙OS应用开发之显示图片组件6
    Unity3D学习笔记9——加载纹理
    【JavaSE】抽象类和接口
    中医自学平台---前端网站
  • 原文地址:https://blog.csdn.net/weixin_49627122/article/details/126669557