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先执行,靠后则后执行。

时间: 2024-08-09 12:26:48

Filter(一)的相关文章

Jsp通过Filter实现UrlRewriter原理

web.xml文件: 1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=&q

JQ中find()与filter()的区别

刚开始学的时候,对于find()和filter()有点理不清楚,下面通过案例相信就可以很快的区分清楚 以下是代码 find弹出的是 filter()弹出的是 下面我们添加div的class是rain find()弹出结果是 fliter弹出结果是 通过以上案例,我们就清楚的知道,find()是查找某个元素内部的元素 filter()查找的是某个元素的自身,而不是内部的元素

spark 教程三 spark Map filter flatMap union distinct intersection操作

RDD的创建 spark 所有的操作都围绕着弹性分布式数据集(RDD)进行,这是一个有容错机制的并可以被并行操作的元素集合,具有只读.分区.容错.高效.无需物化.可以缓存.RDD依赖等特征 RDD的创建基础RDD 1.并行集合(Parallelized Collections):接收一个已经存在的Scala集合,然后进行各种并行运算 var sc=new SparkContext(conf) var rdd=sc.parallelize(Array(2,4,9,3,5,7,8,1,6)); rd

struts2 版本所导致的 Filter 不同

过了好久又重新接触Struts2,使用maven直接获取的struts2-core-2.5.1的包,从网上直接copy了一段web.xml中的Filter,结果报错,struts2.3.x  以后用以下配置: 1 <filter> 2 <filter-name>struts2</filter-name> 3 <filter-class> 4 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExe

web.xml 中的listener、filter、servlet加载及一些配置

在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人的,毕竟人家写的不错,自己也就不重复造轮子了,只是略加点了自己的修饰. 首先可以肯定的是,加载顺序与它们在 web.xml 文件中的先后顺序无关.即不会因为 filter 写在 listener 的前面而会先加载 filter.最终得出的结论是:listener -> filter -> servlet 同时还存在着这样一种配置节:context-param,它用于向 Servlet

Java Web开发——Filter过滤器

一.过滤器 1.1定义 过滤器是一个服务器端的组件,它可以截取用户端的请求与响应信息,并对这些信息进行过滤. 1.2工作原理 1.项目启动时,从Web容器中加载过滤器: 2.过滤器存在于用户请求和Web资源之间: 3.用户请求和Web响应之间的收发都经由过滤器按照过滤规则进行过滤筛选. 1.3过滤器的生命周期 实例化(web.xml加载)→初始化(init方法)→过滤(doFilter方法)→销毁(destroy方法) 1.初始化:当容器第一次加载该过滤器时,init() 方法将被调用.该类在这

【JavaWeb学习】过滤器Filter

一.简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能.例如实现URL级别的权限访问控制.过滤敏感词汇.压缩响应信息等一些高级功能. Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter.通过Filter技

Python-lambda函数,map函数,filter函数

lambda函数主要理解: lambda 参数:操作(参数). lambda语句中,冒号前是参数,可以有多个,用逗号隔开,冒号右边的返回值.lambda语句构建的其实是一个函数对象 map函数: map(function_to_apply, list_of_inputs).map函数可以把list_of_inputs内的对象依次输入到function_to_apply中进行操作. filter函数: filter(function_to_apply, list_of_inputs).Filter

Filter与Servlet的区别和联系

Filter的执行顺序与实例 Filter介绍 Filter可认为是Servlet的一种“变种”,它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理,是个典型的处理链.它与Servlet的区别在于:它不能直接向用户生成响应.完整的流程是:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理. Filter有如下几个用处. 在HttpServletRequest到达Servlet之前,拦截客

Filter简单过滤器的实现

1.过滤器简单编写 package cn.buaa.core.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 ja