javaweb的三大组件都需要交给web服务器运行,都需要在web.xml文件中配置。

①Servlet:javax.servlet.Servlet通过http协议接受客户端的请求,并作出响应的Java应用程序

②Filter过滤器:javax.servlet.Filter是一个接口,实现请求的拦截和放行,并可添加新功能,达到过滤请求的作用

③listener监听器:javax.servlet.xxxlistener用来监听web容器中各种域的实事件

一、定义

官方api文档这样介绍的:

它是公共接口过滤器

  • filter是一个对象,它在对资源(JSP,Servlet,静态图片文件或静态HTML文件)的请求上,或在资源的响应上,或在两者的响应上执行筛选任务。
  • 过滤器在多过滤器方法中执行过滤。每个筛选器都可以访问一个文件配置对象,从该对象中获取初始化参数,例如,它可以使用该对象来加载筛选任务所需的资源。
  • 过滤器配置在Web应用程序的部署描述符中

但是结合一些网上博客的解释更容易懂:

  • 对从客户端向服务器端发送的请求进行过滤,也可以对服务器端返回的响应进行处理。它使用户可以改变一个request和修改一个 response.。
  • Filter 不是一个servlet,它不能产生一个response,但是它能够在一个request到达servlet之前预处理request,也可以在 response离开servlet时处理response。换句话说,filter其实是客户端与servlet中间的一个传递者,并且它可以对要传递的东西进行修改
  • 例如实现URL级别的权限控制、过滤敏感词汇、压缩响应信息等一些高级功能

二、作用以及如何实现拦截的

  • 当客户端发生请求后,在HttpServletRequest 到达Servlet 之前,过滤器拦截客户的HttpServletRequest 。
  • 根据需要检查HttpServletRequest ,也可以修改HttpServletRequest 头和数据。
  • 在过滤器中调用doFilter方法,对请求放行。请求到达Servlet后,对请求进行处理并产生HttpServletResponse发送给客户端。
  • 在HttpServletResponse 到达客户端之前,过滤器拦截HttpServletResponse 。
  • 根据需要检查HttpServletResponse ,可以修改HttpServletResponse 头和数据。
  • 最后,HttpServletResponse到达客户端。

Filter接口中有一个doFilter方法,当开发人员编写好Filter,并配置对哪个web资源(拦截url)进行拦截后,web服务器每次在调用web资源之前,都会先调用一下filter的doFilter方法,因此,在该方法内编写代码可达到如下目的:
 (1)调用目标资源之前,让一段代码执行。
 (2)是否调用目标资源(即是否让用户访问web资源)。
     web服务器在调用doFilter方法时,会传递一个  filterChain对象进来,FilterChain对象是filter接口中最重要的一个对     象,它也提供了一个doFilter方法,开发人员可以根据需求决定是否调用此方法,调用该方法,则web服务器就会       调用web资源的service方法,即web资源就会被访问,否则web资源不会被访问。
 (3)调用目标资源之后,让一段代码执行。

三、filter的四种拦截方式

  • REQUEST:直接访问目标资源时执行过滤器。包括:在地址栏中直接访问、表单提交、超链接、重定向,只要在地址栏中可以看到目标资源的路径,就是REQUEST;
  • FORWARD:转发访问执行过滤器。包括RequestDispatcher#forward()方法、< jsp:forward>标签都是转发访问;
  • INCLUDE:包含访问执行过滤器。包括RequestDispatcher#include()方法、< jsp:include>标签都是包含访问;
  • ERROR:当目标资源在web.xml中配置为< error-page>中时,并且真的出现了异常,转发到目标资源时,会执行过滤器。

四、Filter的生命周期

三个方法:

  • init(FilterConfig  filterConfig) throws ServletException:

     和我们编写的Servlet程序一样,Filter的创建与销毁由WEB服务器负责。web应用程序启动时,web服务器将创建Filter的实例对象,并调用init方法进行初始化(注意:filter对      象只会创建一次,init方法也只会执行一次),开发人员通过init方法的参数,可以获得代表当前filter配置信息的FilterConfig对象。

  • doFilter(ServletRequest, ServletResponse, FilterChain):

     执行过滤任务方法,每次filter进行拦截都会执行,在实际开发中方法中参数request和response通常转换为HttpServletRequest和HttpServletResponse类型进行操作。

  • destroy():

     在web容器卸载Filter对象之前被调用,Web服务器停止或者Web应用重新加载,销毁过滤器对象。

五、FilterConfig对象接口(过滤器配置对象,用于加载过滤器的参数配置)

用户在配置filter时,可以使用<init-param>为filter配置一些初始化参数,当web容器实例化Filter对象,调用其init方法时,会把封装了filter初始化参数的FilterConfig对象传递进来,因此开发人员在编写Filter时,通过FilterConfig对象的方法就可获得过滤器的初始化参数有关的信息以及获取ServletContext对象等信息:

  • String getFilterName():得到filter的名称。
  • String getInitParameter(String name):返回在部署描述中指定名称的初始化参数的值。如果不存在则返回null。
  • Enumeration  getInitParameterNames():返回过滤器中的所有初始化参数的名字的枚举集合。
  • public ServletContext getServletContext():返回Servlet上下文对象的引用。

   在web.xml文件中配置

在过滤器器中使用

五、Filter开发入门

Filter开发分为两个步骤:

  • 步骤一:编写Java类实现Filter接口,并实现(三个方法)其doFilter方法。
  • 步骤二:在web.xml中使用<filter>和<filter-mapping>元素对编写的filter类进行注册,并设置它所能拦截的资源。

Filter链——FilterChain:

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

参考链接(里面有更详细的开发步骤、代码):

https://blog.csdn.net/u013087513/article/details/56835894

https://blog.csdn.net/chenkun2016/article/details/79498618

http://www.cnblogs.com/zlbx/p/4888312.html

Introduction of Servlet Filter(介绍javaweb组件之一过滤器filter)的更多相关文章

  1. 【JavaWeb学习】过滤器Filter

    一.简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静 ...

  2. Javaweb三大组件之过滤器filter

    Filter的三个方法 void init(FilterConfig):在Tomcat启动时被调用: void destroy():在Tomcat关闭时被调用: void doFilter(Servl ...

  3. web 过滤器 Filter、 Spring 拦截器 interceptor

    1.过滤器(Filter)(在web.xml中注册过滤器) 首先说一下Filter的使用地方,我们在配置web.xml时,总会配置下面一段设置字符编码,不然会导致乱码问题: <filter> ...

  4. JavaWeb学习篇之----Servlet过滤器Filter和监听器

    首先来看一下Servlet的过滤器内容: 一.Servlet过滤器的概念: ************************************************************** ...

  5. JavaWeb三大组件—过滤器filter

    JavaWeb三大组件 1. 都需要在web.xml中进行配置ServletListener(2个感知监听器不需要配置)Filter 2. 过滤器 它会在一组资源(jsp.servlet..css.. ...

  6. Introduction of Servlet Filter(了解Servlet之Filter)

    API文档中介绍了public Interface Filter(公共接口过滤器) Servlet API文档中是这样介绍的: ‘A filter is an object that performs ...

  7. JavaWeb笔记——三大组件之过滤器

    过滤器JavaWeb三大组件之一,它与Servlet很相似!不它过滤器是用来拦截请求的,而不是处理请求的.  当用户请求某个Servlet时,会先执行部署在这个请求上的Filter,如果Filter“ ...

  8. JavaWeb学习笔记(二十二)—— 过滤器filter

    一.什么是过滤器 过滤器filter是JavaWeb三大组件之一,它与Servlet很相似!不过过滤器是用来拦截请求的,而不是处理请求的.WEB开发人员通过Filter技术,对web服务器管理的所有w ...

  9. Servlet过滤器Filter和监听器

    一.Servlet过滤器的概念: *********************************************************************************** ...

随机推荐

  1. jQuery的deferred对象使用详解

    转自: https://www.cnblogs.com/PengLee/p/5657101.html jQuery的开发速度很快,几乎每半年一个大版本,每两个月一个小版本.每个版本都会引入一些新功能. ...

  2. linux windows 格式化一块大于2 TiB硬盘

    转自:https://help.aliyun.com/document_detail/34377.html?spm=a2c4g.11186623.2.10.17447386JrLBNR#concept ...

  3. IDEA启动项目内存溢出

    一.java.lang.OutOfMemoryError: Java heap space 1.在tomcat设置界面  VM options添加参数 -server -XX:PermSize=512 ...

  4. Solr中在使用过程中遇到的"与"和"或"的问题

    在进行全文检索的过程中,如果使用三星和手机,两个一块进行搜索的时候,关于三星的会被搜索出来,关于手机的信息也会被搜索出来,然后,需要将一些配置文件进行配置, <!-- DEPRECATED: T ...

  5. idea提交git报错Push rejected: Push to origin/master was rejected

    参考https://blog.csdn.net/u012934325/article/details/71023241

  6. vue 添加旋转图片 修改css transform 值

    //点击放大图片并旋转图片 conponents组建 <template>    <!-- 过渡动画 -->    <transition name="fade ...

  7. 就是要用Vim写Vue

    Vim关于Vue的生态链还是很少,不过凑活凑活还是能用的. 缩进 缩进采用的是两个空格,.vimrc配置: au BufNewFile,BufRead *.html,*.js,*.vue set ta ...

  8. easyUI combobox使用方法总结

    combobox,中文叫复合框,是把文本框和列表框的特性结合起来的一种控件,这个控件,既可以输入文字,也可以像列表框一样选择选项 Combobox用法和方法参数: 1. 需要引入class=" ...

  9. 【搬运工】redis 启动和关闭

    如果是用apt-get或者yum install安装的redis,可以直接通过下面的命令停止/启动/重启redis /etc/init.d/redis-server stop /etc/init.d/ ...

  10. error LNK1169 找到一个或多个多重定义的符号的解决方法

    问题描述如下: 有 三个源文件,A.h.B.cpp.C.cpp. A.h是头文件,其中声明了三个变量a1.a2. a3. B.cpp是A.h中所声明的类的实现源代码,C.cpp是主程序文件.B.cpp ...