Filter被称为过滤器或者拦截器,基本功能就是对调用servler过程的拦截,在servlet进行响应和处理前后实现一些特殊功能。其实,Filter过滤器就是一个实现了javax.servlet.Filter接口的类,在javax.servlet.Filter接口中定义了3个方法:

  • init(FilterConfig filterConfig) : 用来初始化过滤器,可以在init()中完成与构造方法类似的初始化功能,如果初始化代码中要使用FilterConfig对象,那么,这些初始化代码就只能在Filter的init()方法中编写,而不能在构造方法中编写。
  • doFilter(ServletRequest request, ServletResponse response, FilterChain chain) : request和response为Web服务器或Filter链中的上一个Filter对象传递过来的请求和响应对象;参数chain代表Filter链的对象,在当前Filter对象中的doFilter()方法内需要调用FilterChain对象的doFilter()方法,才能把请求交付给Filter链的下一个Filter或者目标程序去处理。
  • public void destroy() : destroy()方法在Web服务器卸载Filter之前被调用,该方法用于释放Filter对象打开的资源,例如关闭数据库和IO流。

1、实现第一个Filter程序

Index.java文件如下:

 package com.net;

 import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class Index extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
out.println("Index");
} protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}

MyFilter.java文件如下:

 package com.net;

 import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse; public class MyFilter implements Filter {
public void init(FilterConfig fConfig) throws ServletException {
System.out.println("MyFilter.init()");
} public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
PrintWriter out = response.getWriter();
out.println("Hello MyFilter");
chain.doFilter(request, response);
} public void destroy() {
System.out.println("MyFilter.destroy()");
}
}

web.xml配置文件添加如下代码:

 <filter>
<filter-name>MyFilter</filter-name>
<filter-class>com.net.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/Index</url-pattern>
</filter-mapping> <servlet>
<servlet-name>Index</servlet-name>
<servlet-class>com.net.Index</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Index</servlet-name>
<url-pattern>/Index</url-pattern>
</servlet-mapping>

测试结果如下:

2、Filter链

Filter链示例图如下:

测试程序如下,Index.java文件和MyFilter.java文件参考实现第一个Filter程序中代码,MyFilter2.java文件和web.xml配置文件如下:

MyFilter2.java文件如下:

 package com.net;

 import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse; public class MyFilter2 implements Filter {
public void init(FilterConfig fConfig) throws ServletException {
} public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
PrintWriter out = response.getWriter();
out.println("Hello MyFilter2 Start");
chain.doFilter(request, response);
out.println("Hello MyFilter2 End");
} public void destroy() {
}
}

web.xml配置文件添加如下代码:

<filter>
<filter-name>MyFilter</filter-name>
<filter-class>com.net.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/Index</url-pattern>
</filter-mapping> <filter>
<filter-name>MyFilter2</filter-name>
<filter-class>com.net.MyFilter2</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> <servlet>
<servlet-name>Index</servlet-name>
<servlet-class>com.net.Index</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Index</servlet-name>
<url-pattern>/Index</url-pattern>
</servlet-mapping>

测试结果如下:

注意:Filter之间的调用顺序什么样的呢?这与他们在web.xml中声明的前后顺序有关, 比如按照上面web.xml配置,Filter的调用顺序为:

请求->MyFilter -> MyFilter2 -> Index(servlet)

响应 <- MyFilter <- MyFilter2 <- Index(servlet)

3、Filter的生命周期

Filter的创建和销毁由web服务器负责。 web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作,filter对象只会创建一次,init方法也只会执行一次。通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。FilterConfig接口封装了Filter程序在web.xml中所有注册信息,并提供了一些获取这些配置信息的方法,如下所示:

MyFilter.java文件如下

package com.net;

import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse; public class MyFilter implements Filter {
public void init(FilterConfig fConfig) throws ServletException {
System.out.println("MyFilter.init()"); //得到过滤器的名字
String filterName = fConfig.getFilterName();
//得到在web.xml文件中配置的初始化参数
String initParam = fConfig.getInitParameter("like"); System.out.println(filterName);
System.out.println(initParam);
} public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
PrintWriter out = response.getWriter();
out.println("Hello MyFilter");
chain.doFilter(request, response);
} public void destroy() {
System.out.println("MyFilter.destroy()");
}
}

MyFilter.java对应的web.xml配置项如下:

<filter>
<filter-name>MyFilter</filter-name>
<filter-class>com.net.MyFilter</filter-class>
<init-param>
<param-name>like</param-name>
<param-value>java</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/Index</url-pattern>
</filter-mapping>

Java Web之Filter的更多相关文章

  1. java web之Filter详解

    java web之Filter详解 2012-10-20 0 个评论 作者:chenshufei2 收藏 我要投稿 .概念: Filter也称之为过滤器,它是Servlet技术中比较激动人心的技术,W ...

  2. java web中filter分析

    摘自博客园,博主孤傲苍狼 一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp ...

  3. Java web学习filter (1)

    一.概念:Filter也称之为过滤器,它是Servlet技术中比较激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源: 例如Jsp, Servlet, 静态图片文件 ...

  4. Java Web进阶——Filter过滤器

    一.过滤器的介绍: 在Servlet规范2.3中定义了过滤器,它是一个服务器端的组件,可以截取用户端的请求与响应信息,并且对这些信息进行过滤. Servlet过滤器本身并不生成请求和响应对象,只是提供 ...

  5. 360[警告]跨站脚本攻击漏洞/java web利用Filter防止XSS/Spring MVC防止XSS攻击

    就以这张图片作为开篇和问题引入吧 <options>问题解决办法请参考上一篇 如何获取360站长邀请码,360网站安全站长邀请码 首先360能够提供一个这样平台去检测还是不错的.但是当体检 ...

  6. java web 自定义filter

    filter顾名思义,过滤器的意思,在javaweb中的Struts就利用了这种机制去实现视图和业务分离. 这里来配置下自己的Filter来理解下Struts的内在. 在web.xml 中添加下面: ...

  7. java Web 过滤器Filter详解

    简介 Filter也称之为过滤器,Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊 ...

  8. java web 中 filter 与 servlet的关系

    过滤器的转载顺序是服务器按照we.xml文件中定义的顺序从后往先的顺序转载的,而过滤的顺序就是按照先后顺序过滤的,而销毁也是从后往先销毁的.

  9. java web filter 学习(2)

    本文主要对filter的基本使用进行了讲解,其中涉及到了 filter是什么 一个filter处理一个jsp 多个filter处理一个jsp filter是什么 Filter 是java下的一种过滤器 ...

随机推荐

  1. MODIS批量处理软件MRT的安装说明

    最近在处理遥感影像的时候遇见了MODIS影像数据,从中MOD13中提取NDVI是相当的重要.在一番的百度之中找到了处理modis影像的神器------MRT 接下来我来说明一下MRT的具体安装,如果之 ...

  2. T3 - 构建大型 Web 应用的 JavaScript 框架

    T3 是一个用于构建大型 Web 应用程序的客户端 JavaScript 框架.T3 和大多数的 JavaScript 框架不同.它的意思是一小部分的整体架构,它允许你建立可扩展的客户端代码.T3 应 ...

  3. 通过gulp为requireJs引入的模块添加版本号

    由于项目用到requireJs,并且通过gulp来对项目进行统一的管理,为了防止浏览器对文件进行缓存,所以通过gulp为项目中的文件添加版本号. 1.分别安装gulp-rev.gulp-rev-col ...

  4. IE中的条件注释(转载自网络)

    IE条件注释是微软从IE5开始就提供的一种非标准逻辑语句,作用是可以灵活的为不同IE版本浏览器导入不同html元素,如:样式表,html标签等.很显然这种方法的最大好处就在于属于微软官方给出的兼容解决 ...

  5. Mongodb的备份,恢复,导入与导出(cmd命令行实现)

    要用MongoDB,自然就要用到数据导入导出,就自己学习了一下. 在Mongo学习(二)中就讲到了在bin目录下有一些工具,本篇就是使用这些工具进行数据的导入导出及备份恢复. 注意:以下命令均在cmd ...

  6. SAP中禁止特定用户更改密码

    在SAP管理中,有时一些账号因为是提供给大家作查询用的,受密码强度策略限制,密码不能为空.故密码设为通用后在公司内发布,为避免有些用户更改后造成其他用户无法登陆,我们可在使用TC-SU01,在登录数据 ...

  7. Asp.net web hosting

      start /D "C:\Program Files\Common Files\Microsoft Shared\DevServer\10.0" /B WebDev.WebSe ...

  8. mysql 时间函数转换

    1 NOW() //当前时间 2 SYSDATE() //当前时间 3 CURRENT_TIMESTAMP 4 以'YYYY-MM-DD HH:MM:SS'或YYYYMMDDHHMMSS格式返回当前的 ...

  9. iOS通讯录开发

    场景一:直接选择一个联系人的电话号码 这里不需要先获取所有的联系人自己做联系人列表,直接使用系统自带的AddressBookUI/ABPeoplePickerNavigationController. ...

  10. 单例模式-用GCD实现

    用GCD实现单例模式的步骤: 步骤1. 创建头文件 XZSingleton.h,里面代码如下: // .h文件 #define XZSingletonH(name) + (instancetype)s ...