做web开发的人对于Filter应该不会陌生,一直在很简单的使用,但是一直没有系统的总结一下,随着年纪的慢慢长大,喜欢总结一些事情,下面说说我对Filter的理解,官方给出的Filter的定义是在请求一个资源或者从一个资源返回信息的时候执行过滤操作的插件。我们使用过滤起最多的场景估计就是在请求和返回时候的字符集转换,或者权限控制,比如一个用户没有登录不能请求某些资源。下面看一下Filter的集中类型:

Authentication Filters

Logging and Auditing Filters

Image conversion Filters

Data compression Filters

Encryption Filters

Tokenizing Filters

Filters that trigger resource access events

XSL/T filters

Mime-type chain Filter

Filters是在web.xml中配置的插件,Servlets和Filters相互没有依赖,如果通过编辑web.xml来添加和删除过滤器。

实现过滤器非常简单,只需要实现javax.servlet.Filter接口,就可以实现一个过滤器,Filter接口定义的方法如下:

void init(FilterConfig filterConfig))--在filter被加载到service中的时候被container调用,Servlet container实例化完filter以后立即调用Filter的init方法,init方法中的工作必须在执行过滤过滤任务之前正确的完成。

在以下情况下web container不能把filter加载到service中:

抛出ServletException异常。

在container定义的时间内没有返回。

void doFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)--Filter中的doFilter方法在每次request/response时候会被container调用,能够传递到doFilter中的request或者response可以传递到Filter环中的下一个环节。 此时的Filter在设计模式中被称作责任链模式结构,这里面抽象处理者的角色就是javax.servlet.Filter这个接口,注册的所有Filter是具体的处理者,在doFilter方法中实现具体处理逻辑,在这里面责任链是一条直线,构成这条直线的就是所有注册的Filter。

destroy--当filter从service中移除的时候,container调用destroy方法,通过调用这个方法,释放Filter所占有的系统资源。

如何在web.xml中配置Filter

1

2 EcodingFilter

3 EcodingFilter

4 org.nb.filter.EnCodeFilter

5

6 EncodeCoding

7 UTF-8

8

9

我们可以使用如下方法来给Filter匹配指定的servlet 资源或者url-pattern:

1

2 EcodingFilter

3 *

4 *

5

在这里需要注意的是,在给servlet注册filter环,container首先处理的是url-patterns,然后才处理servlet-names,所以如果要对filter的执行顺序有要求,那么在此需要注意。下面我们创建一个web工程,来实践一下Filter:

web.xml内容:

1 <?xml version="1.0" encoding="UTF-8"?>

2

3 xmlns="http://java.sun.com/xml/ns/javaee"

4 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"

5 version="3.0">

6 FilterTest

7

8 index.html

9

10

11 EcodingFilter

12 EcodingFilter

13 org.nb.filter.EnCodeFilter

14

15 EncodeCoding

16 UTF-8

17

18

19

20 EcodingFilter

21 hello

22 *

23

24

25 hello

26

27

28

29 hello

30 /*

31

32

HelloServlet.java内容:

1 packageorg.nb.action;2

3 importjava.io.IOException;4 importjava.io.PrintWriter;5

6 importjavax.servlet.ServletException;7 importjavax.servlet.annotation.WebServlet;8 importjavax.servlet.http.HttpServlet;9 importjavax.servlet.http.HttpServletRequest;10 importjavax.servlet.http.HttpServletResponse;11

12 @WebServlet("/helloServlet")13 public class HelloServlet extendsHttpServlet {14 private static final long serialVersionUID = 1L;15

16 protected voiddoPost(HttpServletRequest request,17 HttpServletResponse response) throwsServletException, IOException {18 PrintWriter out =response.getWriter();19 out.println("Hello.");20 }21 }

EnCodeFilter.xm内容:

1 packageorg.nb.filter;2

3 importjava.io.IOException;4 importjava.util.Enumeration;5 importjava.util.HashMap;6 importjava.util.Map;7

8 importjavax.servlet.Filter;9 importjavax.servlet.FilterChain;10 importjavax.servlet.FilterConfig;11 importjavax.servlet.ServletException;12 importjavax.servlet.ServletRequest;13 importjavax.servlet.ServletResponse;14

15 public class EnCodeFilter implementsFilter {16

17 Map params = new HashMap();18

19 @Override20 public voiddestroy() {21 System.out.println("EncodeFilter destroy");22 }23

24 @Override25 public voiddoFilter(ServletRequest request, ServletResponse response,26 FilterChain chain) throwsIOException, ServletException {27 String encodeCoding = params.get("EncodeCoding");28 request.setCharacterEncoding(encodeCoding);29 response.setCharacterEncoding(encodeCoding);30 chain.doFilter(request, response);31 System.out.println("EncodeFilter doFilter");32 }33

34 @Override35 public void init(FilterConfig cfg) throwsServletException {36 Enumeration names =cfg.getInitParameterNames();37 while(names.hasMoreElements()) {38 String name =names.nextElement();39 params.put(name, cfg.getInitParameter(name));40 }41 System.out.println("EncodeFilter init");42 }43

44 }

在tomcat启动的时候Console输出的内容:

三月 24, 2014 5:56:12下午 org.apache.catalina.core.AprLifecycleListener init

信息: The APR based Apache Tomcat Native librarywhich allows optimal performance in production environments was not found on the java.library.path: E:\Program Files\Java\jre7\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;C:\Program Files (x86)\M1 Licensing;C:\Program Files\Broadcom\Broadcom 802.11 Network Adapter\Driver;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\PROGRAM FILES (X86)\INTEL\ICLS CLIENT\;C:\PROGRAM FILES\INTEL\ICLS CLIENT\;C:\Windows\SYSTEM32;C:\Windows;C:\Windows\SYSTEM32\WBEM;C:\Windows\SYSTEM32\WINDOWSPOWERSHELL\V1.0\;C:\PROGRAM FILES (X86)\INTEL\OPENCL SDK\2.0\BIN\X86;C:\PROGRAM FILES (X86)\INTEL\OPENCL SDK\2.0\BIN\X64;C:\PROGRAM FILES\INTEL\INTEL(R) MANAGEMENT ENGINE COMPONENTS\DAL;C:\PROGRAM FILES\INTEL\INTEL(R) MANAGEMENT ENGINE COMPONENTS\IPT;C:\PROGRAM FILES (X86)\INTEL\INTEL(R) MANAGEMENT ENGINE COMPONENTS\DAL;C:\PROGRAM FILES (X86)\INTEL\INTEL(R) MANAGEMENT ENGINE COMPONENTS\IPT;C:\PROGRAM FILES (X86)\LENOVO\ACCESS CONNECTIONS\;C:\Program Files\WIDCOMM\Bluetooth Software\;C:\Program Files\WIDCOMM\Bluetooth Software\syswow64;C:\Program Files (x86)\Intel\OpenCL SDK\3.0\bin\x86;C:\Program Files (x86)\Intel\OpenCL SDK\3.0\bin\x64;E:\Ruby200\bin;E:\Program Files\TortoiseSVN\bin;E:\Program Files\MySQL\MySQL Utilities 1.3.4\;C:\Program Files\Microsoft\Web Platform Installer\;C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET Web Pages\v1.0\;C:\Program Files (x86)\Windows Kits\8.0\Windows Performance Toolkit\;C:\Program Files\Microsoft SQL Server\110\Tools\Binn\;E:\Program Files\Java\jdk1.7.0_40\bin;C:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\;C:\Program Files\Microsoft SQL Server\100\Tools\Binn\;C:\Program Files\Microsoft SQL Server\100\DTS\Binn\;F:\instantclient;.;;.;;.

三月24, 2014 5:56:12下午 org.apache.tomcat.util.digester.SetPropertiesRule begin

警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:FilterTest' did not finda matching property.

三月24, 2014 5:56:13下午 org.apache.coyote.AbstractProtocolHandler init

信息: Initializing ProtocolHandler ["http-bio-8080"]

三月24, 2014 5:56:13下午 org.apache.coyote.AbstractProtocolHandler init

信息: Initializing ProtocolHandler ["ajp-bio-8009"]

三月24, 2014 5:56:13下午 org.apache.catalina.startup.Catalina load

信息: Initialization processedin 1031ms

三月24, 2014 5:56:13下午 org.apache.catalina.core.StandardService startInternal

信息: Starting service Catalina

三月24, 2014 5:56:13下午 org.apache.catalina.core.StandardEngine startInternal

信息: Starting Servlet Engine: Apache Tomcat/7.0.8EncodeFilter init

三月24, 2014 5:56:13下午 org.apache.catalina.startup.HostConfig deployDirectory

信息: Deploying web application directory docs

三月24, 2014 5:56:13下午 org.apache.catalina.startup.HostConfig deployDirectory

信息: Deploying web application directory examples

三月24, 2014 5:56:13下午 org.apache.catalina.core.ApplicationContext log

信息: ContextListener: contextInitialized()

三月24, 2014 5:56:13下午 org.apache.catalina.core.ApplicationContext log

信息: SessionListener: contextInitialized()

三月24, 2014 5:56:13下午 org.apache.catalina.startup.HostConfig deployDirectory

信息: Deploying web application directory host-manager

三月24, 2014 5:56:13下午 org.apache.catalina.startup.HostConfig deployDirectory

信息: Deploying web application directory manager

三月24, 2014 5:56:14下午 org.apache.catalina.startup.HostConfig deployDirectory

信息: Deploying web application directory ROOT

三月24, 2014 5:56:14下午 org.apache.coyote.AbstractProtocolHandler start

信息: Starting ProtocolHandler ["http-bio-8080"]

三月24, 2014 5:56:14下午 org.apache.coyote.AbstractProtocolHandler start

信息: Starting ProtocolHandler ["ajp-bio-8009"]

三月24, 2014 5:56:14下午 org.apache.catalina.startup.Catalina start

信息: Server startupin 978 ms

其中有filter,init方法的输出,下面创建一个index.html文件,内容如下:

1

2

3

4

5

Insert title here

6

7

8

9

10

11

12

点击index.html页面的按钮,

此时Console输出内容:

1 EncodeFilter doFilter

每次请求都会有这样一条输出。

关闭tomcat的时候,注意观察Console输出的内容:

三月 24, 2014 6:08:33 下午 org.apache.catalina.core.StandardServer await

信息: A valid shutdown command was received via the shutdown port. Stopping the Server instance.

三月 24, 2014 6:08:33 下午 org.apache.coyote.AbstractProtocolHandler pause

信息: Pausing ProtocolHandler ["http-bio-8080"]

三月 24, 2014 6:08:34 下午 org.apache.coyote.AbstractProtocolHandler pause

信息: Pausing ProtocolHandler ["ajp-bio-8009"]

三月 24, 2014 6:08:35 下午 org.apache.catalina.core.StandardService stopInternal

信息: Stopping service Catalina

EncodeFilter destroy

三月 24, 2014 6:08:36 下午 org.apache.catalina.core.ApplicationContext log

信息: SessionListener: contextDestroyed()

三月 24, 2014 6:08:36 下午 org.apache.catalina.core.ApplicationContext log

信息: ContextListener: contextDestroyed()

三月 24, 2014 6:08:37 下午 org.apache.coyote.AbstractProtocolHandler stop

信息: Stopping ProtocolHandler ["http-bio-8080"]

三月 24, 2014 6:08:37 下午 org.apache.coyote.AbstractProtocolHandler stop

信息: Stopping ProtocolHandler ["ajp-bio-8009"]

此时Fileter的Destroy方法被调用。Filter的生命周期结束。这篇文章中包含一些信息,如Server,Service,Container等,可能有些人跟我一样开始的时候对此很不了解,如果这样大家可以查一下Tomcat等web容器的工作原理,如果有什么地方我说的不清楚,或者有错误,那么请提醒我,谢谢。

java servlet filter_Java Servlet Filter相关推荐

  1. JAVA基础(16) Servlet/Filter/Listener/Interceptor区别与联系

    一.概念: 1.servlet:servlet是一种运行服务器端的java应用程序,具有独立于平台和协议的特性,并且可以动态的生成web页面,它工作在客户端请求与服务器响应的中间层.最早支持 Serv ...

  2. Servlet组件之一——Filter过滤器

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

  3. 编写 Servlet 2.3 Filter

    Servlets Filter 是Servlet 2.3 规范中新增加的,它是截取用户从客户端提交的请求,在还没有到达需要访问的资源时运行的一个类.它操纵来自客户端的请求,在资源还没有初发送到客户端前 ...

  4. SpringBoot定义三大组件Servlet,过滤器Filter,监听器Listener

    SpringBoot定义三大组件Servlet,过滤器Filter,监听器Listener 1.定义组件的配置类: com.example.mybatis2018.config.MyServletCo ...

  5. servlet过滤器(Filter)

                                              过滤器(Filter) 什么是过滤器    过滤器是Javaweb的三大组件之一.他与servlet很相似,不过过滤 ...

  6. Tomcat对Servlet规范的Filter及Listener实现

    加载Servlet的类不等于创建Servlet实例,Tomcat先加载Servlet的类,然后还得在Java堆创建Servlet实例. 一个Web应用里往往有多个Servlet,而在Tomcat中一个 ...

  7. 基于javaweb的医院挂号管理系统(java+jsp+javascript+servlet+mysql)

    基于javaweb的医院挂号管理系统(java+jsp+javascript+servlet+mysql) 运行环境 Java≥8.MySQL≥5.7.Tomcat≥8 开发工具 eclipse/id ...

  8. JAVA实习笔记——Servlet

    初学者servlet,最大疑问无非是:它是什么?它由什么组成?它的生命周期?它能干什么?它怎么实现 ? servlet 还有很多地方需要学习,我暂时只写了这些,有很不完善的地方,仅代表个人意见,欢迎批 ...

  9. 初学Java Web(4)——Servlet学习总结

    经过一段时间的学习,对于Servlet有了新的不一样的见解,在这里做一下总结,将近来学习到的知识总结一下. Servlet 的请求流程 浏览器发出请求:http://localhost:80/xxx1 ...

最新文章

  1. Sublime Text3配置Node.js开发环境
  2. Assert(断言) 的用法
  3. Andriod anim translate中的属性介绍
  4. C语言 利用malloc()和realloc()动态分配内存
  5. 虚拟机登服务器,用虚拟机登录云服务器
  6. linux伙伴系统算法,Linux伙伴系统(三)--分配
  7. HTTPS 能否避免流量劫持?
  8. ios如何获取gps坐标(定位第二节)
  9. nginx的请求接收流程(一)
  10. 我的内核学习笔记12:linux i2c-gpio驱动应用实例
  11. Monkey测试:日志信息分析
  12. 前端 html h5 移动端 手机端 仿ios左滑删除效果
  13. c语言程序图片截取,C++实现屏幕截图功能
  14. Pandas库之DataFrame
  15. 苹果系统中国日历服务器,简单三步,让 iPhone 自带日历 App 显示国家节假日安排...
  16. 删除oracle所有表外键,Oracle中查询、禁用、起用、删除表外键
  17. 【转载】STM32的全部AltiumDesigner元件库文件
  18. 【大数据技术分享】数据清理的终极指南
  19. win10Edge浏览器或第三方浏览器网页字体模糊解决方法
  20. 淘宝技术发展 - 子柳撰写

热门文章

  1. 命令行编译 WRK ,windbg 调试
  2. JAVASE——File类
  3. 【安全】从mimikatz学习Windows安全之访问控制模型
  4. 001 JAVA基础
  5. PE学习(十一)第十一章:动态加载技术
  6. 7、MySQL设置日志输出方式
  7. unique函数详解
  8. 1020 Tree Traversals (25 分) 【难度: 中 / 知识点: 哈希表建树 遍历树】
  9. MySQL主从复制Windows实现
  10. 终端服务器有多种运行模式,云终端的三种工作模式你都知道的吗