zoukankan      html  css  js  c++  java
  • java web(五):java web三大组件之另外两个和八大监听器

      java的三大组件指Servlet、Filter、Listener。八大监听器指八个接口。前面介绍了Servlet,现在介绍一下Filter拦截器以及拦截地址的设置,

    Listener监听那些事件。

      java web的cookie和session机制有篇博客讲的很好,有兴趣的博友可以去看看。地址:https://www.cnblogs.com/whgk/p/6422391.html


     一:Filter

      1.基本概念

        Filter称之为过滤器,是用来做一些拦截的任务, 在Servlet接受请求之前,做一些事情,如果不满足限定,可以拒绝进入Servlet。

        

        一个web项目中可以配置多个filter过滤器,浏览器访问静态资源如html、jsp、css或者访问动态资源servlet都会经过filter过滤器,满足条件,过滤器放行,否则直接返回。

      2.使用

        filter有很多用处,网上一搜,在filter层,来获取用户的身份,可以考虑在filter层做一些常规的校验(如参数校验,referer校验等),可以在filter层做

      稳定性相关的工作(如全链路打点,可以在filter层分配一个traceId;也可以在这一层做限流等)。我最常见的是spring中的编码过滤器。我们通过编码过滤器认识filter。

        代码:

    package com.briup.servlet.filter;
    
    import java.io.IOException;
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    
    /**
     * Servlet Filter implementation class EncodingFilter
     * 编码过滤器
     */
    public class EncodingFilter implements Filter {
    
        private String encoding;
        
        public EncodingFilter() {}
    
        public void destroy() {}
    
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
                throws IOException, ServletException {
            //设置编码格式【只对post方式有效】;
            request.setCharacterEncoding(encoding);
            response.setCharacterEncoding(encoding);
            //放行;
            chain.doFilter(request, response);
            
            System.out.println("servlet执行完毕,返回到filter");
        }
    
        
        public void init(FilterConfig fConfig) throws ServletException {
            //我们把编码设置在web.xml中,如果需要改编码在配置文件中更改而不需要更改代码
            encoding = fConfig.getInitParameter("encoding");
        }
    
    }

      web.xml:

    <filter>
        <display-name>EncodingFilter</display-name>
        <filter-name>EncodingFilter</filter-name>
        <filter-class>com.briup.servlet.filter.EncodingFilter</filter-class>
        <init-param>
          <param-name>encoding</param-name>
          <param-value>utf-8</param-value>
        </init-param>
      </filter>
      <filter-mapping>
        <filter-name>EncodingFilter</filter-name>
        <!-- /* 代表拦截所有请求 -->
        <url-pattern>/*</url-pattern>
      </filter-mapping>

     访问:http://127.0.0.1:7778/StudyServlet/HelloWorld或者http://127.0.0.1:7778/StudyServlet/success.html,控制台都会输出一句:"servlet执行完毕,返回到filter"。

      

    3.拦截地址的配置

        filter我主要想说的就是拦截地址如何配置了。    

    第一种 【匹配任意】

        <url-pattern>/*</url-pattern> 

    第二种 【精确匹配】

        <url-pattern>/test_servlet</url-pattern>

        表示此拦截器只会拦截/test_servlet这一个路径

    第三种 【扩展名匹配】

              <url-pattern>*.html</url-pattern>

              表示此拦截器只会拦截后缀名是.html的路径

    第四种 【路径匹配】

              <url-pattern>/test/*</url-pattern>

               表示此拦截器拦截/test路径下的所有资源

    注意:服务器内部跳转不会拦截,只会拦截浏览器发送的地址。

    二:监听器

      Servlet监听器的作用是监听Web容器的有效期事件,可以监听由于Web应用中状态改变而引起的Servlet容器产生的相应事件,然后接受并处理这些事件。

      下面简单介绍这8个接口和其中的方法。

      监听ServletContent(应用上下文)

         1.ServletContentListener接口  

          Servlet的上下文监听,它主要实现监听ServletContext的创建和删除

            (1)contextInitialized(ServletContextEvent event); //通知正在收听的对象,应用程序已经被加载和初始化。

            (2)contextDestroyed(ServletCotextEvent event);  // 通知正在收听的对象,应用程序已经被载出,即关闭。

        2.ServletContextAttributeListener接口

          应用上下文存、移除、更改数据进行监听。

            (1)attributeAdded(ServletContextAttributeEvent event); //应用上下文存数据的时候触发【调用setAttribute方法】

            (2)attributeRemoved(ServletContextAttributeEvent event); //ServletContent对象调用removeAttribute方法触发。

            (3)attributeReplaced(ServletContextAttributeEvent event);  //当存数据的时候,key值已经存在,value值被替换的时候触发。

      

      监听session接口

        3.HttpSessionListener接口

          (1)sessionCreated(HttpSessionEvent even); //session被创建的时候触发。

          (2)sessionDestroyed(HttpSessionEvent event); //session过期失效触发

        4.HttpSessionAttributeListener

          用法和ServletContextAttributeListener接口类似。

      

      监听request接口

        5.ServletRequestListener

        6.ServletRequestAttributeListener

      用法和上面类似。

      7.HttpSessionActivationListener;        
         该接口实现监听HTTP会话active和passivate。
                         (1)attributeAdded(HttpSessionBindingEvent event); // 当有对象加入session的范围时,通知正在收听的对象
                         (2)attributeReplaced(HttpSessionBindingEvent event); //当在session的范围有对象取代另一个对象时,通知正在收听的对象。
                         (3)attributeRemoved(HttpSessionBindingEvent event);  //当有对象从session的范围有对象取代另一个对象时,通知正在收听的对象 。

        其中HttpSessionBindingEvent类主要有三个方法:getName()、getSession()和getValue()

      8.HttpBindingListener;                     
        接口实现监听HTTP会话中对象的绑定信息。
                      (1)alueBound(HttpSessionBindingEvent event);   //当有对象加入session的范围时会被自动调用
                      (2)valueUnBound(HttpSessionBindingEvent event);  //当有对象从session的范围内移除时会被自动调用

    注:本文一部分是参考网上资料的。

  • 相关阅读:
    linux驱动开发学习一:创建一个字符设备
    如何高效的对有序数组去重
    找到缺失的第一个正整数
    .NET不可变集合已经正式发布
    中国人唯一不认可的成功——就是家庭的和睦,人生的平淡【转】
    自己动手搭建 MongoDB 环境,并建立一个 .NET HelloWorld 程序测试
    ASP.NET MVC 中如何用自定义 Handler 来处理来自 AJAX 请求的 HttpRequestValidationException 错误
    自己动手搭建 Redis 环境,并建立一个 .NET HelloWorld 程序测试
    ServiceStack 介绍
    一步一步实战扩展 ASP.NET Route,实现小写 URL、个性化 URL
  • 原文地址:https://www.cnblogs.com/yangji0202/p/10554173.html
Copyright © 2011-2022 走看看