JavaWeb——Filter
一、基本概念
之前我们用一篇博文介绍了Servlet相关的知识,有了那篇博文的知识积淀,今天我们学习Filter将会非常轻松,因为Filter有很多地方和Servlet类似,下面在讲Filter的时候,就闲话不絮了。
Filter称之为过滤器,是用来做一些拦截的任务。比如客户端请求服务器的某个资源时(可以是Servlet、JSP、HTML等等),我们可以拦截。当服务器返回资源给客户端的时候,我们也可以拦截。这样我们就可以在调用资源之前和之后分别加入一些业务逻辑。
当我们对某个资源加上多个过滤器的时候,就形成了过滤链。请求(request)会依次通过链上的过滤器,响应(response)会依次以相反的顺序通过过滤器。
二、样例分析
和使用servlet一样,要使用filter只需要两步:1.编写自己的filter,实现javax.servlet.Filter。2.在web.xml中注册该filter。
TestFilter.java
public class TestFilter implements Filter {
public TestFilter() {}
public void init(FilterConfig fConfig) throws ServletException {}
public void destroy() {}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("before doFilter");
chain.doFilter(request, response);
System.out.println("after doFilter");
}
}
web.xml
<filter>
<filter-name>TestFilter</filter-name>
<filter-class>com.nantang.filter.TestFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>TestFilter</filter-name>
<url-pattern>/test</url-pattern>
</filter-mapping>
假定我们在本机部署应用,应用上下文路径是/demo,那么在浏览器里面输入http://localhost:8080/demo/test。则在控制台会输出:"before doFilter"和"after doFilter"。这是我们的请求和响应受到了拦截,在调用具体的Servlet或其他资源前后执行了我们编写的逻辑(例子中就是往控制台打印信息)。
这里需要注意的是,filter可以对url进行过滤,也可以针对具体的servlet进行过滤,只需要制定servlet的名称,如:
<filter-mapping>
<filter-name>TestFilter</filter-name>
<servlet-name>TestServlet</servlet-name>
</filter-mapping>
三、源码分析
我们自己编写的filter都需要实现javax.servlet.Filter接口,下面我们看一下Filter接口的继承层级,并逐一分析。
1 FilterConfig
当容器去初始化一个filter的时候,就会根据web.xml文件的配置和当前的运行环境去构造一个FilterCongif实例并传给filter。所以一个filter对应一个FilterConfig实例。
public interface FilterConfig {
public String getFilterName();
public ServletContext getServletContext();
public String getInitParameter(String name);
public Enumeration getInitParameterNames();
}
getFilterName方法返回我们在web.xml里面配置的名称。
getServletContext返回ServletContext实例,这个和之前介绍Servlet的时候讲到的是一个东西。一个应用就一个ServletContext实例。
getInitParameter和getInitParameterNames和Servlet的类似。就是获取在web.xml里面配置的初始化参数,如:
<filter>
<filter-name>TestFilter</filter-name>
<filter-class>com.nantang.filter.TestFilter</filter-class>
<init-param>
<param-name>param1</param-name>
<param-value>1</param-value>
</init-param>
<init-param>
<param-name>param2</param-name>
<param-value>2</param-value>
</init-param>
</filter>
2 FilterChain
FilterChain就是我们上面说的过滤链,当请求或响应被filter拦截时,容器提供FilterChain实例给filter让其使用。
public interface FilterChain {
public void doFilter ( ServletRequest request, ServletResponse response ) throws IOException, ServletException;
}
FilterChain里面就一个方法doFilter,这个方法就是调用过滤链的下一个filter,如果当前filter是链中最后的一个,则跳转至请求的资源或返回响应给客户端。
3 Filter
Filter里面就三个方法,也就是它的生命周期。和Servlet类似。
public interface Filter {
public void init(FilterConfig filterConfig) throws ServletException;
public void doFilter ( ServletRequest request, ServletResponse response, FilterChain chain ) throws IOException, ServletException;
public void destroy();
}
3.1 init
filter的初始化方法,跟servlet一样在其生命周期内只会被执行一次。但是filter初始化的时机和servlet不一样,当servlet容器(比如Tomcat)启动完成后就会检索web.xml里面配置的filter,从上往下依次回调每个filter的init方法对其进行初始化。(这里的filterConfig参数是容器构造并传入的。)
3.2 doFilter
实现拦截逻辑的地方,比如一个请求被拦截,这里可以在调用具体资源之前编写一些业务逻辑。然后调用chain.doFilter流转到后置filter,如果当前filter是链中最后的一个,则跳转至请求的资源。当chain.doFilter执行完成后,可以再写一些业务逻辑。然后容器将执行权流转到前置filter,如果当前filter是链中最前的一个,则将响应返回给客户端。(这里的参数chain是容器构造并传入的。)
3.3 destory
和servlet的destroy方法同样的道理,当servlet容器关闭或需要更多内存的时候,会销毁filter。这个方法就使得servlet容器拥有回收资源的能力。
同样地,destroy方法在filter的生命周期中只会被调用一次。
四、总结
到这里filter就算结束了,我们可以发现filter的执行模型和servlet很类似,都是servlet容器在调度。整个生命周期都是容器在管控。
作者:南唐三少
出处:http://www.cnblogs.com/nantang
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我们最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文链接,否则保留追究法律责任的权利。
JavaWeb——Filter的更多相关文章
- JavaWeb Filter
1. 过滤器概述 1.1. 什么是过滤器 Filter译为过滤器,是JavaWeb的三大组件之一,用于在Servlet之外对Request或者Response进行修改.对于Web应用程序来说,过滤器是 ...
- JAVAWEB Filter使用
Filter学习 1Filter是什么:是过滤器简称 2Filter有什么作用:在filter中可以得到代表用户请求和响应的request.response对象,因此在编程中可以使用Decorator ...
- JavaWeb——Filter过滤器
1.Filter的目的 Filter用于在Servlet之前检测和修改请求和响应,它可以拒绝.重定向或转发请求.常见的有这几种: 日志过滤器 使用过滤器记录请求,提供请求日志记录,还可以添加追踪信息用 ...
- JavaWeb—过滤器Filter
1.Filter简介 Filter称之为过滤器,是用来做一些拦截的任务.比如客户端请求服务器的某个资源时(可以是Servlet.JSP.HTML等等),我们可以拦截.当服务器返回资源给客户端的时候,我 ...
- Filter、Listener 学习总结
今天我们来介绍 Filter.Listener 这两个模块一些简单的知识和应用,接下来我们开始我们的正题 ! 1. Filter(过滤器) 1.1 对 Servlet 容器调用 Servlet 的过程 ...
- filter和listener的生命周期
filter(过滤器)和listener(监听器)的生命周期 老实说 生命周期要是说成作用的时间范围我会理解的更好 filter package com.javaweb.filter; import ...
- Filter的常见应用
1.字符编码过滤器 实现功能,在a.jsp中填写用户名提交到b.jsp,在b.jsp中读取参数名. a.jsp <body> <form action="encoding/ ...
- Filter内容
1.利用Filter来过滤的时候大都是Http请求和Http响应,在doFilter()方法中,参数类是ServletRequest和ServletResponse ,使用的时候一般需要强制转换为H ...
- jsp版ueditor图片在线管理返回绝对路径
引用:http://zhengyunfei.iteye.com/blog/2149979 如果你有富文本编辑器的功能需要开发,我推荐你用百度的ueditor.本文将与你分享jsp版ueditor开发中 ...
随机推荐
- [原]CentOS7.2部署node-mapnik
转载请注明表作者think8848及出处(http://think8848.cnblogs.com) node-mapnik依赖项中要求g++ >= 5, toolchain (>= GL ...
- Objective-C三种定时器CADisplayLink / NSTimer / GCD的使用
OC中的三种定时器:CADisplayLink.NSTimer.GCD 我们先来看看CADiskplayLink, 点进头文件里面看看, 用注释来说明下 @interface CADisplayLin ...
- Partition1:新建分区表
未分区的表,只能存储在一个FileGroup中:对Table进行分区后,每一个分区都存储在一个FileGroup,或分布式存储在不同的FileGroup中.对表进行分区的过程,是将逻辑上完整的一个表, ...
- Linux下Nodejs安装(完整详细)
之前安装过windows下以及Mac下的node,感觉还是很方便的,不成想今天安装linux下的坑了老半天,特此记录. 首先去官网下载代码,这里一定要注意安装分两种,一种是Source Code源码, ...
- 带你实现开发者头条APP(四)---首页优化(加入design包)
title: 带你实现开发者头条APP(四)---首页优化(加入design包) tags: design,Toolbar,TabLayout,RecyclerView grammar_cjkRuby ...
- 零OCR基础6行代码实现C#验证码识别
这两天因为工作需要,要到某个网站采集信息,一是要模拟登陆,二是要破解验证码,本想用第三方付费打码,但是想想网上免费的代码也挺多的,于是乎准备从网上撸点代码下来,谁知道,撸了好多个都不行,本人以前也没接 ...
- Git初探--笔记整理和Git命令详解
几个重要的概念 首先先明确几个概念: WorkPlace : 工作区 Index: 暂存区 Repository: 本地仓库/版本库 Remote: 远程仓库 当在Remote(如Github)上面c ...
- 破解SQLServer for Linux预览版的3.5GB内存限制 (RHEL篇)
微软发布了SQLServer for Linux,但是安装竟然需要3.5GB内存,这让大部分云主机用户都没办法尝试这个新东西 这篇我将讲解如何破解这个内存限制 要看关键的可以直接跳到第6步,只需要替换 ...
- Mybatis XML配置
Mybatis常用带有禁用缓存的XML配置 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE ...
- (翻译)FIFO In Hardware
翻译一些自己觉得有价值的材料,工作中碰到英语大多数是读,基本没有写或者翻的,翻得不好不到位的敬请指摘. 同时也附原文以供参考. http://electronics.stackexchange.com ...