Filter基金会

一个、总结

  简单的说,Filter的作用就是拦截(Tomcat的)service(Request,Response)方法。拿到Request、Response对象进行处理。然后释放控制。继续自己主动流转。其运用的还是“分层”的思想。

  至于为什么要增加这一层,为什么要对Request、Response对象进行拦截。个人感觉根本原因是为了对多个server资源(Servlet、JSP等)的请求、对应进行一些公共的设置。这里强调的是“多个”。

假设是一个资源,就没有设置Filter的必要,由于仅仅须要在这个资源须要的地方(之前)设置Request、Response就可以。也就是“设置”放到哪里都能够,由于非常多请求、响应有非常多共同的设置,所以将共同之处抽出来作为一层。就是所谓的Filter。

作用例如以下图:

 

传统调用:

 

 

 

加上Filter:

 

 

 

二、FilterChain

  当几个Servlet有一些同样的设置(过滤),而另几个Servlet有其他同样的设置……,这样一个Filter是不能完毕全部的过滤,所以就须要多个Filter协作来共同完毕这项任务。

于是著名的FilterChain就出来了。那么这个FilterChain中的多个Filter是怎样协作的呢?

  每一个Filter的职能不同,当一个Servlet的请求到达后,这个请求就会沿着这条Filter链,一个一个走过,走到它须要的Filter时。这个Filter就会进行对它的Request、Response进行操作。完成后自己主动向下流转。这就是所谓的职责链模式。

  每一个Filter有3个方法:

  Ø  init(FilterConfig filterConfig)

  Ø  doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

  Ø  destroy()

  三个方法(以下进行具体介绍)依次运行,一个Filter链中的多个Filter的运行顺序例如以下图:

  

 

  即:运行第一个过滤器的chain.doFilter()之前的代码---->第二个过滤器的chain.doFilter()之前的代码---->……---->第n个过滤器的chain.doFilter()之前的代码---->所请求servlet的service()方法中的代码——>所请求servlet的doGet()或doPost()方法中的代码---->第n个过滤器的chain.doFilter()之后的代码---->……---->第二个过滤器的chain.doFilter()之后的代码---->第一个过滤器的chain.doFilter()之后的代码。

 

三、主要接口与方法

  首先Servlet过滤器API包括了3个接口,它们都在javax.servlet包中,各自是Filter接口、FilterChain接口和FilterConfig接口。

使用

  Ø  全部的过滤器都必须实现Filter接口。

该接口定义了init(),doFilter(),destory()三个方法。

  Ø  FilterChain接口作为了doFilter0方法的參数:  doFilter(ServletRequest request, ServletResponse response,FilterChain chain)

  Ø  FilterConfig接口作为了init()方法的參数: init(FilterConfig filterConfig)

  也就是,过滤器类将实现Filter接口,然后使用这个过滤器类中的FilterChain和FilterConfig接口。该过滤器类的—个引用将传递给FilterChain对象,以同意过滤器把控制权传递给链中的下一个资源。FilterConfig对象将由容器提供给过滤器,以同意訪问该过滤器的初始化数据。

以下对3个接口与所包括的方法进行简要介绍:

 

Filter接口

  1)       public void init (FilterConfig filterConfig) throws  ServletException.

  当開始使用servlet过滤器服务时。Web容器调用此方法一次。为服务准备过滤器;即通过FilterConfig对象拿到过滤器的初始化參数。即配置文件里配置的信息。然后在须要使用过滤器的时候调用doFilter()。并传递配置信息。

  2)       public voiddoFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException

  每一个过滤器都接受当前的请求和响应,且FilterChain过滤器链中的过滤器(应该都是符合条件的)都会被运行。doFilter方法中,过滤器能够对请求和响应做它想做的一切,通过调用他们的方法收集数据,或者给对象加入新的行为。

  过滤器通过传送至此方法的FilterChain參数,调用chain.doFilter()将控制权传送给下一个过滤器。当这个调用返回后,过滤器能够在它的 Filter方法的最后对响应做些其他的工作。假设过滤器想要终止请求的处理或得到对响应的全然控制,则能够不调用下一个过滤器。而将其重定向至其他一些页面。

当链中的最后一个过滤器调用chain.doFilter()方法时。将执行最初请求的Servlet。

  3)       public voiddestroy()

  假设doFilter()法里的全部线程退出或已超时,容器调用此方法。

server调用destory()以指出过滤器已结束服务。用于释

放过滤器占用的资源。

 

FilterChain接口

  1)     public voiddoFilter(ServletRequest requestServletResponse response)   throws java.io.IOException,ServletException

  此方法是由Servlet容器提供给开发人员的,用于对资源请求过滤链的依次调用,通过FilterChain调用过滤链中的下一个过滤   器,假设是最后一个过滤器,则下一个就调用目标资源。

 

FilterConfig接口

   FilterConfig接口检索过滤器名、初始化參数以及活动的Servlet上下文。

  1)       public java.lang.String getFilterName()

  2)       public  ServletContext  getServletContex()

  3)       public java.lang.String  getlnitParameter(java.lang.String name)

  4)       public java.util.Enumeration getlnitParameterNames()

 

四、配置使用

  过滤器通过Web应用程序中的配置描写叙述符web.xml文件里的明。包含部分<filter>、<filter-mapping>:


<filter>。主要包含:

  1)       <filter-name>和<f'flter-class>两个必须的子元素

  2)       <icon>、<init-param>,<display-name>,<description>这4个可选的子元素。

  <filter-name>子元素定义了—个过滤器的名字,<filter-class>指定了由容器加载的实际类,<init-param>子元素为过滤器提供初始化參数。


<filter-mapping>主要由

  1)       <filter-name>,<servlet-name>和<url-pattem>子元素组成。

<servlet-name>将过滤器映射到一个或多个Servlet上,<url-pattem>将过滤器映射到—个或多个随意特征的URL的JSP页面。

 

<url-pattem>的4种配置方式: 

  <filter><filter-name>CharsetEncodingFilter</filter-name><filter-class>com.bjpowernode.drp.util.filter.CharsetEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>GBK</param-value></init-param></filter><!--精确匹配,不採用不论什么修饰符 --><filter-mapping><filter-name>CharsetEncodingFilter</filter-name><url-pattern>/servlet/TestServlet</url-pattern></filter-mapping><!--扩展匹配,由*号和扩展名组成 --><filter-mapping><filter-name>CharsetEncodingFilter</filter-name><url-pattern>*.jsp</url-pattern></filter-mapping><!--路径前缀匹配。包括一个文件夹和一个/* --><filter-mapping><filter-name>CharsetEncodingFilter</filter-name><url-pattern>/servlet/*</url-pattern></filter-mapping><!--全匹配。使用/* --><filter-mapping><filter-name>CharsetEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>


五、代码演示样例:


Filter类:

package com.bjpowernode.drp.util.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 javax.servlet.ServletResponse;import org.omg.CORBA.Request;
/*** 採用Filter允许处理字符集* @author v-wangzhip*/
public class CharsetEncodingFilter implements Filter {private String encoding;@Overridepublic void destroy() {// TODO Auto-generated method stub}@Overridepublic void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {//System.out.println("CharsetEncodingFilter---->begin");//设置字符集request.setCharacterEncoding(encoding);//继续向下运行chain.doFilter(request, response);//System.out.println("CharsetEncodingFilter---->end");}@Overridepublic void init(FilterConfig filterConfig) throws ServletException {this.encoding=filterConfig.getInitParameter("encoding");System.out.println("encoding---->"+ encoding);}
}

 

Web.xml配置:

  <filter><filter-name>CharsetEncodingFilter</filter-name><filter-class>com.bjpowernode.drp.util.filter.CharsetEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>GBK</param-value></init-param></filter><filter-mapping><filter-name>CharsetEncodingFilter</filter-name><url-pattern>*.jsp</url-pattern></filter-mapping><filter-mapping><filter-name>CharsetEncodingFilter</filter-name><url-pattern>/servlet/*</url-pattern></filter-mapping>

 

六、总结

  个人感觉,Filter是将多个请求-响应中公共的须要设置的东西提出来插入到请求-响应之间的一个中间层。

多个Filter组成一个FilterChain。每一个Filter有自己的职能。能依照一定规则来处理到达的请求和响应,体现了职责链模式。

Filter仅仅对post请求起作用,它提供了一种声明式服务。具有可插拔能力,即能够任意开启和关闭。

 

版权声明:本文博客原创文章,博客,未经同意,不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/459986.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python2处理耗时任务_RabbitMQ Go客户端教程2——任务队列/工作队列

本文翻译自RabbitMQ官网的Go语言客户端系列教程&#xff0c;本文首发于我的个人博客&#xff1a;liwenzhou.com&#xff0c;教程共分为六篇&#xff0c;本文是第二篇——任务队列。这些教程涵盖了使用RabbitMQ创建消息传递应用程序的基础知识。 你需要安装RabbitMQ服务器才能完…

使用 CSS3 伪元素实现立体的照片堆叠效

CSS3 里引入的伪元素让 Web 开发人员能够在不需要额外添加 HTML 标签的情况下制作出复杂的视觉效果。例如&#xff0c;:before 和 :after 这个两个 CSS3 伪元素就可以帮助你实现很多有趣的效果。本教程将告诉你如何使用 CSS3 为元素创建一组漂亮的图片堆叠效果。 效果演示 …

启发式搜索A*算法

A* 寻路算法 (2011-02-15 10:53:11) 转载▼标签&#xff1a; 游戏 分类&#xff1a; 算法概述 虽然掌握了 A* 算法的人认为它容易&#xff0c;但是对于初学者来说&#xff0c; A* 算法还是很复杂的。 搜索区域(The Search Area) 我们假设某人要从 A 点移动到 B 点&#xff0c…

centos7全盘备份到本地_CentOS7下制作openssl1.1.1i RPM包并升级

点击上方"walkingcloud"关注&#xff0c;并选择"星标"公众号CentOS7下制作openssl1.1.1i RPM包并升级OpenSSL最新漏洞 OpenSSL官方发布了拒绝服务漏洞风险通告&#xff0c;漏洞编号为CVE-2020-1971漏洞详情OpenSSL是一个开放源代码的软件库包&#xff0c;应…

计算机网络基础专业找工作,2021计算机网络技术前景怎么样? 好找工作吗

很多同学想知道计算机网络技术前景怎么样&#xff0c;以下是一些相关信息的整理&#xff0c;希望能对同学们有所帮助&#xff01;计算机网络技术前景从目前的情况看&#xff0c;企业的IT技术管理岗位一般设置为企业信息主管、总监等&#xff1b;工程技术岗位设置为网络工程师、…

安装 VMware Tools

第一步&#xff1a;挂载VMware Tools 第二步&#xff1a; 将上图VMware Tools-9.2.0 XXXX.tar.gz 复制到tmp目录&#xff08;其他目录也行&#xff0c;没有权限操作需要 chmod 777 XXX 修改来获取权限&#xff09; 第三步&#xff1a;解压 tar xvzf VMwareTools-9.2.0-799703.t…

LINUX添加一块网卡地址配置及问题

如何如何网卡服务重启慢关掉service NetworkManager stopchkconfig NetworkManager off 关于NetworkManager外链&#xff1a;http://www.linuxidc.com/Linux/2013-08/88809.htm 查看cat /etc/udev/rules.d/70-persistent-net.rules是否网卡名有重复VMware虚拟机安装好CentOS6.…

[每日一题jQuery] jQuery选择器总结:进一步过滤、同级操作、后代操作

jQuery选择器继承自CSS的风格&#xff0c;可以通过jQuery选择器找出特定的DOM元素&#xff0c;在此基础上对该元素做相应处理。jQuery不仅支持简单的标签选择器、类选择器、id选择器&#xff0c;还针对表单状态、子元素、元素顺序提供相应的选择器。如果熟练运用&#xff0c;则…

计算机桌面备份在哪里,电脑备份文件在哪里

电脑是我们经常使用的工具&#xff0c;为了放在电脑出现系统问题&#xff0c;有的朋友会将电脑系统备份&#xff0c;但是不知道电脑备份文件放在什么地方了&#xff0c;电脑备份文件在哪里呢&#xff1f;很多朋友还是不知道的&#xff0c;所以针对电脑备份文件保存在哪里的问题…

如何用python打印田字格_如何用 3D 打印一双顶级跑鞋回形针

马拉松赛场上的跑鞋五光十色&#xff0c;除了美观之外&#xff0c;它们还有一个重要作用&#xff1a;保护运动员不受伤害。跑步时&#xff0c;从脚碰到地面开始会受到地面的反作用力。从着陆的减速到随着脚步推蹬过程的加速&#xff0c;这一过程中脚和地面的压力会达到两个峰值…

什么可以作为gcroot_面包果既能当水果又可以作为粮食,国内却无法普及,这是为什么?...

水果是我们大多数人日常都会吃的一种食物&#xff0c;现在国内的水果种类也是非常多&#xff0c;不管是国内本有的还是从国外进口的。但是你吃过面包果吗&#xff1f;可千万不要把它和非洲大陆上的面包树混为一谈&#xff0c;面包果和它半毛钱关系没有&#xff0c;它的原产地在…

cookies的存值问题

2019独角兽企业重金招聘Python工程师标准>>> cookies存值问题&#xff0c;项目中遇到问题初始化时由于cookies中存在冒号导致存到cookies中时取出来被转码了&#xff0c;冒号的转码从cookies中取出来为%A3 &#xff0c;当然一开始我的设想是保存到cookies换一种保存…

c++ 一个函数包括多个返回值判断_Python函数的概念和使用

函数为了便于程序的维护和更好的实现模块化&#xff0c;好的程序都会分解为很多函数。可以这么说&#xff0c;对于任何的编程语言&#xff0c;函数都是一个非常重要的概念。python 不仅简化了函数的定义过程&#xff0c;而且还大量借鉴了其他函数编程语言中的优秀特性。本章内容…

微型计算机中JNZ,微机原理jnz是什么指令_微机原理内存分配图

微机原理 数据传送指令微机原理 4指令系统 3通过数据传输地址 地址传送指令 标志传送指令微机原理 4指令系统 3通过数据传输地址 地址传送指令 标志传送指令微机原理指令 微机原理sub指令 csdn微机原理 4指令系统 3通过数据传输地址 地址传送指令 标志传送指令微机原理 4指令系…

分段处理_连续油管无限级可开关固井滑套分段压裂工艺

连续油管无限级可开关固井滑套分压工艺具有无需射孔、处理级数不受限制、施工效率高等特点&#xff0c;同时可为后期水平井控水及重复压裂提供井筒条件。作业前滑套与套管管柱一趟下入井内&#xff0c;正常进行固井后&#xff0c;依靠固井水泥实现压裂层间封隔。通过连续油管下…

access 根据id删除数据_小程序云开发之数据库自动备份丨云开发101

钻石有价&#xff0c;数据无价。我们通常会把重要的业务数据存放在数据库中&#xff0c;并需要对数据库做定时的自动备份工作&#xff0c;防止数据异常丢失&#xff0c;造成无法挽回的损失。小程序云开发提供了方便的云数据库供我们直接使用&#xff0c;云开发使用了腾讯云提供…

国家职业资格计算机调试维修技师试题,电工国家职业资格三级(高级)理论试题...

电工国家职业资格三级理论试题一、单选题(第1题&#xff5e;第60题。选择一个正确的答案&#xff0c;将相应的字母填入题内的括号中。每题1.0分&#xff0c;满分60分。)1.异步测速发电机的空心杯转子是用( )材料做成的。(A)低电阻 (B)高电阻 (C)低导磁 (D…

PHP解决方案@时间差异计算函数

为什么80%的码农都做不了架构师&#xff1f;>>> 方案解决目标&#xff1a;计算时间差异 function ago($time){ $periods array("second","minute","hour","day","week","month","year",…

baidumap vue 判断范围_vue 数据渲染

本文转载于 SegmentFault 社区社区专栏&#xff1a;山外de楼作者&#xff1a;山外de楼前言 vue 是如何将编译器中的代码转换为页面真实元素的&#xff1f;这个过程涉及到模板编译成 AST 语法树&#xff0c;AST 语法树构建渲染函数&#xff0c;渲染函数生成虚拟 dom&#xff0c;…

jtoken判断是否包含键_Redis 数据库、键过期的实现

今天看看作为内存数据库&#xff0c;Redis 是怎么存储数据的以及键是怎么过期的。阅读这篇文章你将会了解到&#xff1a;Redis 的数据库实现Redis 键过期的策略数据库的实现我们先看代码 server.h/redisServerstruct redisServer{ ... //保存 db 的数组 redisDb *db; //db 的数…