一、Filter简介

Web开发人员通过Filter技术,对Web服务器管理的所有Web资源:JSP、Servlet、静态文件、静态HTML等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。

Servlet API提供了一个Filter接口,开发Web应用时,如果编写的Java实现了这个接口,则把这个Java类称之为过滤器Filter。通过Filter技术,开发人员可以实现用户在访问某个目标之前,对访问的请求和响应进行拦截。

二、Filter接口

1.相关API

init(FilterConfig filterConfig)

在Web应用程序启动时,Web服务器根据web.xml文件中的配置信息来创建每个注册的Filter实例对象,并将其保存在服务器内存中。Web容器创建Filter对象实例后,将立即执行该Filter对象的init方法。init方法在Filter生命周期中仅执行一次,Web容器在调用init方法时,会传递一个包含Filter的配置和运行环境的FilterConfig对象。

destroy()

在Web容器卸载Filter对象之前被调用,该方法在Filter生命周期中仅执行一次。在这个方法中,可以释放过滤器使用的资源。

doFilter(ServletRequest request,ServletResponse response,FilterChain chain)

当客户端请求目标资源时,容器就会调用与这个目标资源相关联的过滤器的doFilter()方法。在该方法编写代码可以达到以下三个目的:

(1) 可以在filter中根据条件是否调用doFilter(req,resp)方法,即是否让目标资源执行。

(2)在让目标执行之前可以对request/response做预处理,再让目标资源执行。

(3)在目标资源执行之后,可以捕捉目标资源的执行结果,从而实现一些特殊的功能。

Web服务器在调用doFilter()方法时,会传递一个filterChain对象进来,filterChain对象是Filter接口重要的对象,它也提供了一个doFilter()方法。开发人员可以根据需求决定是否调用此方法,调用该方法,则Web服务器就会调用Web资源的service方法,即Web资源就会被访问,否则Web资源不会被访问。

2.使用步骤

Filter开发分为二个步骤

(1)编写java类实现Filter接口,并实现其doFilter方法。

(2)在 web.xml 文件中使用<filter>和<filter-mapping>元素对编写的filter类进行注册,并设置它所能拦截的资源。

FirstFilter.java

public class FirstFilter implements Filter{

	@Override
public void init(FilterConfig filterConfig) throws ServletException{
System.out.println("FirstFilter.......init");
} @Override
public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) throws IOException,
ServletException{ //对request和response进行一些预处理
request.setCharacterEncoding("UTf-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8"); System.out.println("FirstFilter执行前...");
chain.doFilter(request,response);
System.out.println("FirstFilter执行后...");
} @Override
public void destroy(){
System.out.println("FirstFilter.......destroy");
} }

web.xml

	<!-- 注册Filter -->
<filter>
<filter-name>FirstFilter</filter-name>
<filter-class>com.kiwi.filter.FirstFilter</filter-class>
</filter> <!-- 映射Filter -->
<filter-mapping>
<filter-name>FirstFilter</filter-name>
<url-pattern>/index.jsp</url-pattern>
</filter-mapping>

3.Filter链

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

三、FilterConfig接口

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

String getFilterName(): 得到filter的名称。

String getInitParameter(String name): 返回在部署描述中指定名称的初始化参数的值。如果不存在返回null。

Enumeration getInitParameterNames(): 返回过滤器的所有初始化参数的名字的枚举集合。

public ServletContext getServletContext(): 返回Servlet上下文对象的引用。

secondFilter.java

public class SecondFilter implements Filter{

	@Override
public void init(FilterConfig filterConfig) throws ServletException{
System.out.println("SecondFilter.......init"); System.out.println("---------下面获取单个参数---------"); String data = filterConfig.getInitParameter("data");
System.out.println("data = " + data); System.out.println("---------下面获取参数列表---------"); Enumeration<String> names = filterConfig.getInitParameterNames();
while( names.hasMoreElements()){
String name = names.nextElement();
String value = filterConfig.getInitParameter(name);
System.out.println("name = " + name + " value = " + value);
}
} @Override
public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) throws IOException,
ServletException{
System.out.println("SecondFilter.......doFilter");
} @Override
public void destroy(){
System.out.println("SecondFilter.......destroy");
} }

web.xml

	<filter>
<filter-name>SecondFilter</filter-name>
<filter-class>com.kiwi.filter.SecondFilter</filter-class>
<init-param>
<param-name>data</param-name>
<param-value>123</param-value>
</init-param>
<init-param>
<param-name>data2</param-name>
<param-value>abc</param-value>
</init-param>
</filter>

结果:

SecondFilter.......init
---------下面获取单个参数---------

data = 123

---------下面获取参数列表---------

name = data value = 123

name = data2 value = abc

四、Filter应用

1.禁止浏览器缓存所以动态页面

有3个Http响应头字段可以禁止浏览器缓存,它们在Servlet代码如下。

response.setDateHeader("Expires",-1);
response.setHeader("Cache-Control","no-cache");
response.setHeader("Pragma","no-cache");

并不是所有的浏览器都能完全支持上面的三个响应头,因此最好是同时使用上面的三个响应头。

Expires数据头: 值为GMT时间值,为-1指浏览器不要缓存页面
     Cache-Control响应头有两个常用值: no-cache指浏览器不要缓存当前页面。

max-age:xxx指浏览器缓存页面xxx秒。

NoCacheFilter.java

**
* 禁止浏览器缓存所有动态页面的过滤器
*/
public class NoCacheFilter implements Filter{ @Override
public void init(FilterConfig filterConfig) throws ServletException{ } @Override
public void doFilter(ServletRequest req,ServletResponse resp,FilterChain chain) throws IOException,
ServletException{ HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response = (HttpServletResponse)resp; //禁止浏览器缓存所有动态页面
response.setDateHeader("Expires",-1);
response.setHeader("Cache-Control","no-cache");
response.setHeader("Pragma","no-cache"); chain.doFilter(request,response);
} @Override
public void destroy(){ } }

web.xml

	<filter>
<filter-name>NoCacheFilter</filter-name>
<filter-class>com.kiwi.filter.NoCacheFilter</filter-class>
</filter> <filter-mapping>
<filter-name>NoCacheFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>

2.控制浏览器缓存页面中的静态资源

有些动态页面中引用了一些图片或css文件以修饰页面效果,这些图片和css文件经常是不变化的,所以为减轻服务器的压力,可以使用filter控制浏览器缓存这些文件,以提升服务器的性能。

public class CacheFilter implements Filter {

    private FilterConfig filterConfig;

    public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp; //1.获取用户想访问的资源
String uri = request.getRequestURI(); //2.得到用户想访问的资源的后缀名
String ext = uri.substring(uri.lastIndexOf(".")+1); //得到资源需要缓存的时间
String time = filterConfig.getInitParameter(ext);
if(time!=null){
long t = Long.parseLong(time)*3600*1000;
//设置缓存
response.setDateHeader("expires", System.currentTimeMillis() + t);
} chain.doFilter(request, response); } public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
} public void destroy() { }
}
<!-- 配置缓存过滤器 -->
<filter>
<filter-name>CacheFilter</filter-name>
<filter-class>me.gacl.web.filter.CacheFilter</filter-class>
<!-- 配置要缓存的web资源以及缓存时间,以小时为单位 -->
<init-param>
<param-name>css</param-name>
<param-value>4</param-value>
</init-param>
<init-param>
<param-name>jpg</param-name>
<param-value>1</param-value>
</init-param>
<init-param>
<param-name>js</param-name>
<param-value>4</param-value>
</init-param>
<init-param>
<param-name>png</param-name>
<param-value>4</param-value>
</init-param>
</filter>
<!-- 配置要缓存的web资源的后缀-->
<filter-mapping>
<filter-name>CacheFilter</filter-name>
<url-pattern>*.jpg</url-pattern>
</filter-mapping> <filter-mapping>
<filter-name>CacheFilter</filter-name>
<url-pattern>*.css</url-pattern>
</filter-mapping> <filter-mapping>
<filter-name>CacheFilter</filter-name>
<url-pattern>*.js</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CacheFilter</filter-name>
<url-pattern>*.png</url-pattern>
</filter-mapping>

JavaWeb总结(九)—过滤器的更多相关文章

  1. JavaWeb中监听器+过滤器+拦截器区别、配置和实际应用

    JavaWeb中监听器+过滤器+拦截器区别.配置和实际应用 1.前沿上一篇文章提到在web.xml中各个元素的执行顺序是这样的,context-param-->listener-->fil ...

  2. JavaWeb学习笔记九 过滤器、注解

    过滤器Filter filter是对客户端访问资源的过滤,符合条件放行,不符合条件不放行,并且可以对目标资源访问前后进行逻辑处理. 步骤: 编写一个过滤器的类实现Filter接口 实现接口中尚未实现的 ...

  3. JavaWeb之Filter过滤器

    原本计划这一篇来总结JSP,由于JSP的内容比较多,又想着晚上跑跑步减减肥,所以今天先介绍Filter以及它的使用举例,这样的话还有些时间可以锻炼锻炼.言归正传,过滤器从字面理解她的话有拦网.过滤的功 ...

  4. Introduction of Servlet Filter(介绍javaweb组件之一过滤器filter)

    javaweb的三大组件都需要交给web服务器运行,都需要在web.xml文件中配置. ①Servlet:javax.servlet.Servlet通过http协议接受客户端的请求,并作出响应的Jav ...

  5. 超全面的JavaWeb笔记day21<过滤器>

    1.过滤器的原理 2.实现过滤器 写一个类实现javax.servlet.Filter接口 在web.xml中对Filter进行配置 3.Filter接口 void init(FilterConfig ...

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

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

  7. 【JavaWeb】Filter 过滤器

    Filter 过滤器 简介 Filter 过滤器是 JavaWeb 三大组件之一 Filter 过滤器是 JavaEE 的规范,也就是接口 Filter 过滤器的作用是 拦截请求,过滤响应 拦截请求的 ...

  8. JavaWeb学习笔记——过滤器

    JSP可以完成的功能Servlet都可以完成,但是Servlet具备的很多功能是JSP所不具备的. 从使用上来看,Servlet可以分成简单Servlet.过滤Servlet(过滤器)和监听Servl ...

  9. JavaWeb三大组件——过滤器的运行机制理解

    过滤器Filter 文章前言:本文侧重实用和理解. 一.过滤器的概念. lFilter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有 ...

随机推荐

  1. Linux下ls命令显示符号链接权限为777的探索

    Linux下ls命令显示符号链接权限为777的探索 --深入ls.链接.文件系统与权限 一.摘要 ls是Linux和Unix下最常使用的命令之一,主要用来列举目录下的文件信息,-l参数允许查看当前目录 ...

  2. Angular.js之Router学习笔记

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  3. DP 动态规划

    p1269 马棚 题目: 每天,小明和他的马外出,然后他们一边跑一边玩耍.当他们结束的时候,必须带所有的马返回马棚,小明有K个马棚.他把他的马排成一排然后跟随它走向马棚,因为他们非常疲劳,小明不想让他 ...

  4. w7如何安装配置多个tomcat

    最近工作比较闲,所以我就开始做自己的项目.公司的的项目用的是tomcat7 为了和公司的项目区分开,我打算再配置一个tomcat.问题也就随之而至.经过整理之后,我整理出了一个完整的流程.保证可以在w ...

  5. Extjs中grid前端分页使用PagingMemoryProxy【二】

        在项目中遇到Grid前端分页,本人也是刚接触extjs没多久,为了实现效果,一直找了很久才实现出来,对于代码中的一些也不能详细的说明出来, 不知道能不能帮助到遇到同样问题的朋友,所以将例子代码 ...

  6. Java对象序列化的使用和定制

    序列化的概念及使用场合 序列化就是把对象转化为字节序列并持久化保存,可以保存在内存中.磁盘文件系统,甚至通过网络传递,并能够在以后将这个字节序列完全恢复为原来的对象. 对象序列化的概念引入Java是为 ...

  7. 2659: [Beijing wc2012]算不出的算式

    2659: [Beijing wc2012]算不出的算式 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 757  Solved: 425[Submit] ...

  8. xml与json的原理,区别,优缺点.

    1.定义介绍 (1).XML定义扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许 ...

  9. Java 字节流操作

    在java中我们使用输入流来向一个字节序列对象中写入,使用输出流来向输出其内容.C语言中只使用一个File包处理一切文件操作,而在java中却有着60多种流类型,构成了整个流家族.看似庞大的体系结构, ...

  10. UWP--MVVM简单计算器

    namespace LBI.DataBinding { /// <summary> /// 可用于自身或导航至 Frame 内部的空白页. /// </summary> pub ...