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开发中 ...
随机推荐
- 动画requestAnimationFrame
前言 在研究canvas的2D pixi.js库的时候,其动画的刷新都用requestAnimationFrame替代了setTimeout 或 setInterval 但是jQuery中还是采用了s ...
- requests的content与text导致lxml的解析问题
title: requests的content与text导致lxml的解析问题 date: 2015-04-29 22:49:31 categories: 经验 tags: [Python,lxml, ...
- 利用Node.js的Net模块实现一个命令行多人聊天室
1.net模块基本API 要使用Node.js的net模块实现一个命令行聊天室,就必须先了解NET模块的API使用.NET模块API分为两大类:Server和Socket类.工厂方法. Server类 ...
- Linux之搭建自己的根文件系统
Hi!大家好,我是CrazyCatJack.又和大家见面了.今天给大家带来的是构建Linux下的根文件系统.希望大家看过之后都能构建出符合自己需求的根文件系统^_^ 1.内容概述 1.构造过程 今天给 ...
- js数组学习整理
原文地址:js数组学习整理 常用的js数组操作方法及原理 1.声明数组的方式 var colors = new Array();//空的数组 var colors = new Array(3); // ...
- Android中Activity处理返回结果的实现方式
大家在网上购物时都有这样一个体验,在确认订单选择收货人以及地址时,会跳转页面到我们存入网站内的所有收货信息(包含收货地址,收货人)的界面供我们选择,一旦我们点击其中某一条信息,则会自动跳转到订单提交界 ...
- docker4dotnet #2 容器化主机
.NET 猿自从认识了小鲸鱼,感觉功力大增.上篇<docker4dotnet #1 前世今生&世界你好>中给大家介绍了如何在Windows上面配置Docker for Window ...
- v14.0\AspNet\Microsoft.Web.AspNet.Props 找不到
错误 E:\Github\AutoMapper\src\AutoMapper\AutoMapper.CoreCLR.kproj : error : 未找到导入的项目"C:\Program ...
- Photoshop、Illustrator思维导图笔记
半年前学习Photoshop时记得的思维导图笔记,可能不是很全,常用的基本都记下了.
- Membership三步曲之进阶篇 - 深入剖析Provider Model
Membership 三步曲之进阶篇 - 深入剖析Provider Model 本文的目标是让每一个人都知道Provider Model 是什么,并且能灵活的在自己的项目中使用它. Membershi ...