WEB开发——过滤器(filter、filterChain、filterConfig、过滤器部署、处理浏览器缓存、字符集乱码)

过滤器: Filter ,javax.servlet包下)
●  对Servlet容器调用Servlet的过程进行拦截,在Servlet进行响应处理的前后实现一些特殊的功能
●  Servlet API中定义了三个接口类来供开发人员编写Filter程序:Filter、FilterChain、FilterConfig
●  Filter程序是一个实现了Filter接口的Java类,与Servlet程序相似,它由Servlet容器进行调用和执行
●  需要在web.xml文件中进行注册和设置它所拦截的资源( Jsp, Servlet, 静态图片文件和静态html文件)
------------------------------------------------------------------------------------------------------------------
基本工作原理:
●  当注册了Filter拦截处理时,这个Filter就成了Servlet容器与该Servlet程序的通信线路上的一道关卡,可以对Servlet容器发送给Servlet程序的请求和回送进行相应拦截,决定是否将请求继续传递,以及对请求和相应信息是否进行修改
●  可以注册多个Filter程序,每个Filter程序都可以对一个或一组 Servlet 程序进行拦截
●  多个Filter程序对某个Servlet程序的访问过程进行拦截,web容器将把这多个Filter程序组合成一个Filter链(过滤器链)。Filter链中各个Filter的拦截顺序与它们在应用程序的web.xml中映射的顺序一致
------------------------------------------------------------------------------------------------------------------
Filter接口:
WEB开发——过滤器(filter、filterChain、filterConfig、过滤器部署、处理浏览器缓存、字符集乱码)_第1张图片
init():
在web应用程序启动时,web 服务器将根据 web.xml 文件中的配置信息来创建每个注册的 Filter 实例对象,并将其保存在服务器的内存中。Web容器创建 Filter 对象实例后,将立即调用该 Filter 对象的 init 方法。Init 方法在 Filter 生命周期中仅执行一次,web 容器在调用 init 方法时,会传递一个包含 Filter 的配置和运行环境的 FilterConfig 对象(FilterConfig的用法和ServletConfig类似)。利用FilterConfig对象可以得到ServletContext对象,以及部署描述符中配置的过滤器的初始化参数。在这个方法中,可以抛出ServletException异常,通知容器该过滤器不能正常工作
destroy():
●  在Web容器卸载Filter对象之前被调用。该方法在Filter的生命周期中仅执行一次。释放过滤器使用的资源
doFilter(): 类似于Servlet接口的service()方法
●  当客户端请求目标资源时,容器就会调用与这个目标资源相关联的过滤器的doFilter()方法
●  参数arg0、arg1为web容器或Filter链的上一个Filter传递过来的请求和相应对象
●  参数arg2代表当前Filter链的对象,在特定的操作完成后,调用doFilter(arg0,arg1)方法把请求放行到下一个过滤器或者Servlet程序去处理,也可以直接向客户端返回响应信息,或者利用RequestDispatcher的forward()和include()方法,以及HttpServletResponse的sendRedirect()方法将请求转向到其他资源。这个方法的请求和响应参数的类型是ServletRequest和ServletResponse,也就是说,过滤器的使用并不依赖于具体的协议
注意:与开发Servlet不同的是,Filter接口并没有相应的实现类可供继承,要开发过滤器,只能直接实现Filter接口
------------------------------------------------------------------------------------------------------------------
FilterChain接口:
代表当前Filter链的对象。由容器实现,容器将其实例作为参数传入过滤器对象的doFilter()方法中。过滤器对象使用FilterChain对象调用过滤器链中的下一个过滤器,如果该过滤器是链中最后一个过滤器,那么将调用目标资源
------------------------------------------------------------------------------------------------------------------
FilterConfig接口: (类似于ServletConfig接口)
由容器实现。Servlet规范将代表 ServletContext 对象和 Filter 的配置参数信息都封装在该对象中。Servlet 容器将其作为参数传入过滤器对象的init()方法中。
●  getFilterName() :获得注册到WEB容器时Filter的名字
●  getInitParameter(String  name) :获得指定初始化参数名的值
●  getInitParameterNames() :获得所有初始化的参数名
●  getServletContext() :返回Servlet上下文对象的引用
------------------------------------------------------------------------------------------------------------------
过滤器的部署: (与servlet配置相同)
WEB开发——过滤器(filter、filterChain、filterConfig、过滤器部署、处理浏览器缓存、字符集乱码)_第2张图片

●  :用于为过滤器指定一个名字,该元素的内容不能为空
●  :元素用于指定过滤器的完整的限定类名
●  :过滤器指定初始化参数,子元素指定参数的名字,指定参数的值。在过滤器中,可以使用FilterConfig接口对象来访问初始化参数
WEB开发——过滤器(filter、filterChain、filterConfig、过滤器部署、处理浏览器缓存、字符集乱码)_第3张图片
:(设置Filter所负责拦截的资源,可通Servlet名称或访问的请求路径( url样式)来指定)
●  :用于设置filter的注册名称(对应元素中声明的过滤器的名字)
●  :设置filter所拦截的请求路径(过滤器关联的URL样式)
●  :指定过滤器所拦截的Servlet名称

●  :拦截方式(REQUEST、INCLUDE、FORWARD、ERROR,默认REQUEST)可以设置多个

WEB开发——过滤器(filter、filterChain、filterConfig、过滤器部署、处理浏览器缓存、字符集乱码)_第4张图片

注意:可以为同一个Filter设置多个映射。若一个Filter链中多次出现了同一个Filter程序,这个Filter程序的拦截处理过程将被多次执行
------------------------------------------------------------------------------------------------------------------

●  REQUEST :当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用
●  INCLUDE :如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用
●  FORWARD :如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用
●  ERROR :如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用
WEB开发——过滤器(filter、filterChain、filterConfig、过滤器部署、处理浏览器缓存、字符集乱码)_第5张图片
------------------------------------------------------------------------------------------------------------------
处理浏览器的缓存:
有3个HTTP响应头字段都可以禁止浏览器缓存当前页面,它们在Servlet中的示例代码如下:
●  response.setDateHeader("Expires",-1);
●  response.setHeader("Cache-Control","no-cache");?
●  response.setHeader("Pragma","no-cache");?
注意:并不是所有的浏览器都能完全支持上面的三个响应头,因此最好是同时使用上面的三个响应头
------------------------------------------------------------------------------------------------------------------
字符集乱码的过滤器:
通过配置参数encoding指明使用何种字符编码,以处理Html Form请求参数的中文问题
●  通过在web.xml中配置,上下文初始参数,通过init()方法初始化得到这个参数,在doFilter()方法中修改字符集编码传入

●  通过访问外部文件,通过init()方法类加载来得到。在doFilter()方法中修改字符集编码传入
WEB开发——过滤器(filter、filterChain、filterConfig、过滤器部署、处理浏览器缓存、字符集乱码)_第6张图片
------------------------------------------------------------------------------------------------------------------
总结:
●  Filter与servlet一样都是一个单例的
●  在web工程被加载时,构建Filter的对象,并调用init方法
●  当访问的URI地址与注册Filter时定义的拦截地址相同时,会触发该Filter的doFilter方法
●  工程被卸载时,调用destroy方法。用于销毁filter
------------------------------------------------------------------------------------------------------------------
自己整理,有些地方是扒拉的,如有侵犯,还望告知

你可能感兴趣的:(WEB开发,filter,filterChain,filterConfig,过滤器部署,处理浏览器缓存,字符集乱码)