Filter

Posted Actexpler

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Filter相关的知识,希望对你有一定的参考价值。

Filter

               先把Filter的基础知识绘制成思维导图的形式,便于记忆

一、Filter简介:

              Filter又称为过滤器,就是实现浏览器与服务器之间的过滤问题,作用是在浏览器的请求在到达WEB资源(html、CSS、Servlet、JSP)之前进行拦截。然后能够进行一些操作:例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。

Filter 的作用:

1.Filter可以在请求到达目标资源之前进行拦截 2.Filter也可以放行请求 3.Filter可以在响应到达浏览器之前做一个预处理

二、Filter的实现原理

    也就是Filter是怎么实现拦截的?

     因为Filter是实现Filter接口,而该接口会提供一个doFilter方法;当创建好Filter类后,实现doFilter方法,在web-xml文件中部署好Filter后,每当浏览器向服务器发送请求时,在调用service方法之前都会执行doFilter方法,这时候就可以对网页进行一些过滤和其他的操作;也就是说Filter就像一个门口的保安一样,在你进入小区之前会核实你的身份,如果允许进入就同行,不是本小区的陌生人,就可能让你先登个记在让你进(同行前进行一些操作),出来的时候可能还需要在登个记(放行之后的操作),如果是黑名单上的人就不允许进入。

   这就是Filter的功能(在doFilter中实现):

        访问目标资源前进行一些操作

        是否允许调用目标资源(是否放行)

        调用目标资源后的一些操作

三、Filter类的创建

         3.1使用Filter的步骤

                 1.编写Java类实现Filter接口,并实现doFilter方法;

                 2.在web-xml文件中进行配置

1).Java的实现范例

public class myFilter implements Filter{
	@Override
	public void init(FilterConfig arg0) throws ServletException {//初始化方法
		System.out.println("init初始化");		
	}
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {  //doFilter方法
		System.out.println("放行前");
		System.out.println("doFilter");	
		chain.doFilter(request, response);//放行
		System.out.println("放行后");
	}
	@Override
	public void destroy() {//销毁方法
		System.out.println("destroy销毁");
	}
}

 2)web-xml文件的配置代码

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>web-filter</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <!-- 注册过滤器 -->
  <filter>
      <!-- 注册过滤器的名,程序员在程序中使用 -->
  	<filter-name>myFilter</filter-name>
  	 <!-- 配置类,给程序使用,程序识别class类 -->
  	<filter-class>com.deuedu.filter.myFilter</filter-class>
  </filter>
  <!-- 映射过滤器 -->
  <filter-mapping>
     <!-- 映射过滤器,能够通过这个找到注册过滤器名,所以这两个名要一致 -->
  	<filter-name>myFilter</filter-name>
  	<!-- 拦截的请求 -->
  	<url-pattern>/1.jsp</url-pattern>
  </filter-mapping>
</web-app>

 四、Filter的部署

   就是上述在web-xml进行配置的过程,两步:1是注册Filter,2是映射Filter

  1)、注册Filter

        

<!-- 注册过滤器 -->
  <filter>
      <!-- 注册过滤器的名,程序员在程序中使用 -->
  	<filter-name>myFilter</filter-name>
  	 <!-- 配置类,给程序使用,程序识别class类 -->
  	<filter-class>com.deuedu.filter.myFilter</filter-class>
  </filter>

当然可以在注册的时候添加参数,通过init-param来实现

 <!-- 注册过滤器 -->
  <filter>
      <!-- 注册过滤器的名,程序员在程序中使用 -->
  	<filter-name>myFilter</filter-name>
  	 <!-- 配置类,给程序使用,程序识别class类 -->
  	<filter-class>com.deuedu.filter.myFilter</filter-class>
    <init-param>
 7        <description>初始化参数</description>
 8        <param-name>name</param-name>
 9        <param-value>孙悟空</param-value>
10   </init-param>
  </filter>

 

       <description>用于添加描述信息,该元素的内容可为空,<description>可以不配置。

  <filter-name>用于为过滤器指定一个名字,该元素的内容不能为空。
  <filter-class>元素用于指定过滤器的完整的限定类名。
  <init-param>元素用于为过滤器指定初始化参数,它的子元素<param-name>指定参数的名字,<param-value>指定参数的值。在过滤器中,可以使用FilterConfig接口对象来访问初始化参数。如果过滤器不需要指定初始化参数,那么<init-param>元素可以不配置。

2)映射Filter

<!-- 映射过滤器 -->
  <filter-mapping>
     <!-- 映射过滤器,能够通过这个找到注册过滤器名,所以这两个名要一致 -->
  	<filter-name>myFilter</filter-name>
  	<!-- 拦截的请求 -->
  	<url-pattern>/1.jsp</url-pattern>
  </filter-mapping>

 <filter-mapping>元素用于设置一个 Filter 所负责拦截的资源。一个Filter拦截的资源可通过两种方式来指定:Servlet 名称和资源访问的请求路径
  <filter-name>子元素用于设置filter的注册名称。该值必须是在<filter>元素中声明过的过滤器的名字
  <url-pattern>设置 filter 所拦截的请求路径(过滤器关联的URL样式)
  <servlet-name>指定过滤器所拦截的Servlet名称。
  <dispatcher>指定过滤器所拦截的资源被 Servlet 容器调用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默认REQUEST。用户可以设置多个<dispatcher> 子元素用来指定 Filter 对资源的多种调用方式进行拦截。

  1. REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用。
  2. INCLUDE:如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
  3. FORWARD:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。
  4. ERROR:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用

3)

url-pattern的设置规则

 
1.精确匹配:只有当目标资源的地址和url-pattern的地址一模一样时,Filter才会拦截资源
例子:/2.jsp , 只有当浏览器访问项目根目录下的2.jsp时,才会调用Filter
 
2.路径匹配:当访问的资源在url-pattern配置的路径下时,Filter就会拦截资源。
例子1:/hello/* , 只要访问项目根目录下hello下的资源,就会调用Filter。
例子2:/* , 会拦截项目根目录下所有资源
 
3.后缀匹配:只要访问的资源地址和url-pattern的后缀一样就会调用Filter
例子:*.jsp 只要是以jsp结尾的请求都会拦截

五、Filter生命周期

   1.Filter的创建

               Filter的创建和销毁由WEB服务器负责。 web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作filter对象只会创建一次(单例模式),init方法也只会执行一次。通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。

2、Filter的销毁

               Web容器调用destroy方法销毁Filter。destroy方法在Filter的生命周期中仅执行一次。在destroy方法中,可以释放过滤器使用的资源。

六、Filter链

       在一个web应用中,可以开发编写多个Filter,这些Filter组合起来称之为一个Filter链。web服务器根据Filter在web.xml文件中的注册顺序,决定先调用哪个Filter,当第一个Filter的doFilter方法被调用时,web服务器会创建一个代表Filter链的FilterChain对象传递给该方法。在doFilter方法中,开发人员如果调用了FilterChain对象的doFilter方法,则web服务器会检查FilterChain对象中是否还有filter,如果有,则调用第2个filter,如果没有,则调用目标资源。

多个Filter的执行顺序,有filter-mapping标签的配置顺序决定,
filter-mappint靠前,则filter先执行,靠后则后执行。

以上是关于Filter的主要内容,如果未能解决你的问题,请参考以下文章

JS常用代码片段2-值得收藏

filter与servlet

php代码片段: sendFile/videoStream/sendEmail/phpexcel/ffmpeg/zip

将多个输出中的hls属性设置为单独的片段代码

text 此片段用于以下知识库文章 - http://kb.wpbeaverbuilder.com/article/591-create-a-filter-to-customize-the-di

如何利用redis来进行分布式集群系统的限流设计