Java EE-06-Filter和Listener

1. Filter

  1. Filter功能:
    1. 在HttpServletRequest到达Servlet之前,拦截客户的HttpServletRequest。根据需要检查HttpServletRequest,也可以修改HttpServletRequest头和数据
    2. 在HttpServletResponse到达客户端之前,拦截HttpServletResponse。根据需要检查HttpServletResponse,也可以修改HttpServletResponse头和数据
  2. 过滤器在doFilter方法中执行过滤,每个过滤器都可以访问一个FilterConfig对象,从中获取初始化参数,以及一个对ServletContext的引用
  3. Filter仅在配置它的项目中生效

1.1 Filter使用

  1. 创建javax.servlet.Filter接口实现类

    public class FilterImpl implements Filter {
        public void destroy() {
        }
    
        public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
            // 统一设置请求的编码方式
            req.setCharacterEncoding("UTF-8");
            // 统一设置响应的编码方式(这种硬编码解决响应乱码的方式会导致下载功能出现问题)
            resp.setContentType("text/html;charset=UTF-8");
            // 放行
            chain.doFilter(req, resp);
        }
    
        public void init(FilterConfig config) throws ServletException {
        }
    }
    
  2. 配置该实现类的过滤路径:

    1. 配置文件方式:在web.xml的web-app标签里配置Filter实现类的过滤路径

      <!--配置Filter实现类的信息-->
      <filter>
          <!--配置Filter名称,可以任意,但建议与类名相同-->
          <filter-name>FilterImpl</filter-name>
          <!--配置Filter类的全路径-->
          <filter-class>com.liu2m.filter.FilterImpl</filter-class>
      </filter>
      <!--配置Filter映射关系-->
      <filter-mapping>
          <!--配置关联的Filter名称,要和上面配置的实现类信息相对应-->
          <filter-name>FilterImpl</filter-name>
          <!--配置过滤路径:指定过滤哪些请求,可配置多个
          过滤路径只能是本项目中的路径,且不用写本项目虚拟路径
          绝对匹配*:/path
          目录匹配:/a/b/*
          扩展名匹配:*.后缀
          缺省匹配:/      除了jsp以外的都能匹配
          目录匹配和扩展名匹配不能同时使用
          -->
          <url-pattern>/</url-pattern>
      </filter-mapping>
      
    2. 注解方式:在该实现类上添加@WebFilter("过滤路径")

      @WebFilter(urlPatterns = {"/uri1", "/uri2", "/uri3"})
      

1.2 Filter生命周期

  1. init方法:服务器启动时会调用init方法初始化Filter对象
    1. FilterConfig对象可以获取Filter的初始化参数
  2. doFilter方法:每次匹配过滤路径到的请求,Filter都会调用doFilter()方法进行过滤
  3. destroy方法:服务器正常关闭或项目从服务器移除时,会调用destory方法销毁Filter对象

1.3 过滤方式

dispatcherTypes属性值:

  1. DispatcherType.REQUEST:默认值,只过滤来自客户端的请求(如:浏览器直接请求、重定向、等)
  2. DispatcherType.FORWARD:只过滤转发的请求
  • 一般情况下不过滤转发,直接使用默认值的情况偏多
@WebFilter(dispatcherTypes = {DispatcherType.FORWARD, DispatcherType.REQUEST})

1.4 过滤器链

  1. 过滤器链作用:一个请求可能被多个过滤器所过滤,只有当所有过滤器都放行,请求才能到达目标资源,如果有某一个过滤器没有放行,那么请求就无法到达后续过滤器以及目标资源
  2. 过滤器链执行顺序:
    1. 配置文件:按照配置文件中filter-mapping的书写顺序执行
    2. 注解方式:按照Filter类名的首字母顺序执行

2. Listener

JavaWeb中的监听器可以监听域对象的状态,事件源和监听器的绑定通过配置web.xml完成

2.1 Listener使用

  1. 创建监听器接口实现类

  2. 绑定事件源和监听器:

    1. 在web.xml的web-app标签里绑定:

      <listener>
          <!--配置监听器的全路径-->
          <listener-class>com.liu2m.listener.SclImpl</listener-class>
      </listener>
      
    2. 注解方式绑定:在实现类上添加@WebListener

  3. 事件对象(如:servletContextEvent),可以获取事件源(如:ServletContext)

2.2 常用监听器

  1. ServletContextListener监听器可以监听ServletContext域对象的创建和销毁,即可以监听服务器的启动和关闭*
    1. contextInitialized方法在ServletContext域对象创建时执行
    2. contextDestroyed方法在ServletContext域对象销毁时执行
  2. ServletContextAttributeListener监听器可以监听:
    1. attributeAdded方法在属性添加到ServletContext中时执行
    2. attributeRemoved方法在属性从ServletContext中移除时执行
    3. attributeReplaced方法在属性从ServletContext中被替换时执行
  3. HttpSessionListener监听器可以监听HttpSession域对象的创建和销毁
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,367评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,959评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,750评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,226评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,252评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,975评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,592评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,497评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,027评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,147评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,274评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,953评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,623评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,143评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,260评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,607评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,271评论 2 358

推荐阅读更多精彩内容

  • Filter和Listener 1. Filter 概念:Filter(过滤器),当访问服务器资源时,过滤器可以将...
    青丶空阅读 191评论 2 0
  • Filter:过滤器 Listener:监听器 Filter(重点) 概念:生活中的过滤器:净水器,空气净化器,土...
    abboo阅读 207评论 0 0
  • Listener 监听器,监听某一个事件的发生。其实就是接口回调,被监听的方法接收一个接口作为参数,在被监听方法中...
    hgzzz阅读 269评论 0 0
  • 监听器(listener) 监听器简介 :监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个...
    奋斗的老王阅读 2,511评论 0 53
  • 表情是什么,我认为表情就是表现出来的情绪。表情可以传达很多信息。高兴了当然就笑了,难过就哭了。两者是相互影响密不可...
    Persistenc_6aea阅读 125,226评论 2 7