过滤器和监听器

过滤器概述

可参考:https://www.cnblogs.com/coderland/p/5902878.html

生活中的过滤器:饮水机,烟嘴, 口罩, 丈母娘等,将人们不需要的东西过滤掉,得到想要的东西(单向的)
Web的过滤器(Filter):对请求或者是响应信息进行过滤(双向的)

过滤器的作用:其中最重要的就是filter功能.它使用户可以改变一个request和修改一个response. Filter 不是一个servlet,它不能产生一个response,它能够在一个request到达servlet之前预处理request,也可以在response离开servlet时处理response.换种说法,filter其实是一个“servlet chaining“(servlet 链).

  1. 在servlet被调用之前截获;
  2. 在servlet被调用之前检查servlet request;
  3. 根据需要修改request头和request数据;
  4. 根据需要修改response头和response数据;
  5. 在servlet被调用之后截获.

Filter的开发

回忆Servlet的开发流程:

1.定义一个类,去实现javax.servlet.Servlet接口,覆写其中的5个方法
2.在web.xml文件中配置Servlet:将Servlet交给服务器来管理

<servlet>
    <servlet-name></serlvet-name>
    <servlet-class></serlvet-class>
</servlet>
<servlet-mapping>
    <servlet-name></serlvet-name>
    <url-pattern>Servlet的资源名称:供外界来通过该名称来访问到当前的Servlet</url-pattern>
</servlet-mapping>

访问Servlet资源:

          http://localhost:80/上下文路径/Servlet的资源名称

Filter的开发流程
1.定义一个类,去实现一个javax.servlet.Filter接口,覆写其中的三个方法
2.在web.xml文件中配置Filter,将Filter交给服务器管理

<filter>
    <filter-name></filter-name>
    <filter-class></filter-class>
</filter>
<filter-mapping>
    <filter-name></filter-name>
    <url-pattern>用来指定对哪些资源进行过滤</url-pattern>
</filter-mapping>
url-pattern:
    /*:可以对所有的资源进行过滤
                         /xxx/*:对/xxx的资源进行过滤
                         /hello:对资源名称为/hello的资源进行过滤
          http://localhost:80/上下文路径/hello

Filter映射细节

在应用中,通常是存在多个过滤器,这些过滤器形成了一个链(过滤器链:FilterChain)
在每个过滤器执行完成之后,需要执行一个放行的操作,然后在执行下一个过滤器
注意:执行哪一个过滤器是由服务器来决定,根据<serlvet-mapping>的顺序决定
如果使用注解配置Filter,由Filter的类名决定
AFilter BFilter

Filter的生命周期:

       1.在服务器启动的时候执行Filter的初始化操作
       2.在正常关闭服务的时候销毁

Filter的过滤的请求类型

 Filter默认情况下只是对一次正常的请求进行过滤

如果需要对其他类型的请求进行过滤,如何解决????
Filter的过滤的请求类型
注意:如果需要对正常的请求进行拦截,必须显示的配置出来

请求编码过滤器

回顾:在Servlet中,如果有硬编码,在<servlet>元素中做如下的配置

<init-param>
    <param-name>encoding</param-name>
    <param-value>UTF-8</param-value>
</init-param>

然后再在Servlet中通过ServletConfig中提供的方法获取初始化参数
String value = config对象.getInitParameter(“encoding”);

在Filter中,如果有硬编码,在<filter>元素中做如下的配置

<init-param>
    <param-name>encoding</param-name>
    <param-value>UTF-8</param-value>
</init-param>

然后再在Filter中通过FilterConfig中提供的方法获取初始化参数
String value = config对象.getInitParameter(“encoding”);

Listener

可参考:http://www.cnblogs.com/hellojava/archive/2012/12/26/2833840.html

事件驱动编程:
简单地说就是你点什么按钮(即产生什么事件),电脑执行什么操作(即调用什么函数)。
事件驱动编程中核心对象:
事件源:谁发出事件通知,发出消息;也就是事件主体,比如按钮;
事件名称:发出什么样的通知的名称,比如鼠标到我头上了,我被别人点了一下;
事件响应函数:谁对这个这个事件感兴趣,当这个事件发生时要执行什么样的操作;
事件对象:一般来说,当事件发生时,会产生一个描述该事件的具体对象,包含事件相关信息。

web中的监听器:

作用域对象的监听

       请求作用域: ServletRequestListener(requestDestroyed(ServletRequestEvent sre)/requestInitialized(ServletRequestEvent sre))
       会话作用域: HttpSessionListener(sessionCreated(HttpSessionEvent se) /sessionDestroyed(HttpSessionEvent se) )
       应用作用域: ServletContextListener(contextDestroyed(ServletContextEvent sce) /contextInitialized(ServletContextEvent sce))

作用域共享数据的监听:

      ServletRequestAttributeListener :  attributeAdded/attributeRemoved/attributeReplaced
      HttpSessionAttributeListener  :  attributeAdded/attributeRemoved/attributeReplaced
      ServletContextAttributeListener  :  attributeAdded/attributeRemoved/attributeReplaced

开发Listener的流程:
1.定义一个类,去实现对应的接口
2.将监听器交给服务器管理