Servlet之过滤器Filter详解

一、过滤器的基本工作原理

1、过滤器的基本工作原理

过滤器的基本工作原理如图4-8示。

2、过滤器的特点

过滤器具备有以下特点:

(1)它是声明式的

(2)它是动态的

(3)它是模块化的

(4)它是可移植的

(5)它是可重用的

(6)它是透明的

二、过滤器的API接口及部署信息

1、javax.servlet.Filter接口

(1)public void init(FilterConfig filterConfig) throws ServletException

init()方法执行初始化操作

(2) public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws java.io.IOException,ServletException

过滤器的业务逻辑代码在doFilter()方法内实现

(3)public void destroy()

在销毁一个过滤器对象之前,此方法被调用来释放init()中申请的资源,这个方法的执行,表示一个过滤器的生命期结束

2、 javax.servlet.FilterConfig接口

(1)public java.util.Enumeration getInitParameterNames()

将初始化参数的变量名读至枚举型对象中。

(2)public java.lang.String

getInitParameter(java.lang.String name)

读取指定变量名的初始化参数值,如果没有此参数,则返回Null值。

(3)public ServletContext getServletContext()

获得当前Web应用的ServletContext对象。

3、javax.servlet. FilterChain接口

接口中关键的方法为:

public void doFilter(ServletRequest  request,

ServletResponse response)  throws  java.io.IOException,ServletException

4、过滤器的部署

在WEB-INF\web.xml中部署一个过滤器的过程有:注册过滤器、映射过滤器

(1)注册过滤器

过滤器在Web应用中注册后才会被容器加载运行。在web.xml中注册过滤器的方法如下示:

<filter>

<filter-name>my1</filter-name>

<filter-class>com.abc.mis.Filter1</filter-class>

<init-param>

<param-name>password</param-name>

<param-value>123</param-value>

</init-param>

</filter>

容器为一个<filter></filter>元素创建一个过滤器实例,同一个过滤器类可以生成多个实例,此时只需要部署多个<filter></filter>元素,例如:

<filter>

<filter-name>my1</filter-name>

<filter-class>com.abc.mis.Filter1</filter-class>

<init-param>

<param-name>password</param-name>

<param-value>123</param-value>

</init-param>

</filter>

(2)映射过滤器

过滤器映射就是定义此过滤器的激活条件,一般是通过目标资源的URI模式和请求的类型来定义。URI中可以使用通配符“*”来表达请求的URI模式。过滤器映射的基本方法如下示:

<filter-mapping>

<filter-name>my1</filter-name>

<url-pattern>/test/*</url-pattern>

<dispatcher>REQUEST</dispatcher>

<dispatcher>FORWARD</dispatcher>

</filter-mapping>

三、第一个过滤器程序

过滤器的基本编程过程是:

第一步:编辑与编译过滤器程序,把编译后得到的包文件夹及*.class类发布到ROOT\WEB-INF\classes文件夹下。

第二步:编辑WEB-INF\web.xml文件,添加过滤器的部署信息。

第三步:重启Tomcat或重载Web应用,使过滤器生效。

【例】:定义三个过滤器:

如果用户访问“/test”下的资源时,过滤器1被激活,它判断用户是否已经登录,如果没有登录则中断请求,并返回404错误信息,如果已经登录则将请求转发给下一个过滤器。

定义过滤器2,当请求“/*”资源并且请求是来自客户端时它才被激活,显示提示信息,然后把请求转发给下一个过滤器。

过滤器3的功能同过滤器2,但它的请求类型为REQUEST或FORWARD。

操作步骤如下:

(1) 启动JC4,新建一个类“Filter1”,在代码编辑窗口中输入如下的代码:

<span style="font-family:SimSun;"><span style="font-family:FangSong_GB2312;font-size:14px;">package my;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class Filter1 implements Filter {

  private FilterConfig config = null;

  public void init(FilterConfig config) throws ServletException {
    this.config = config;
  }

  public void destroy() {
    config = null;
  }

  public void doFilter(ServletRequest request, ServletResponse response,
                     FilterChain chain) throws IOException, ServletException
 {
    response.setCharacterEncoding("GB2312");
    PrintWriter out=response.getWriter();
	HttpSession session=((HttpServletRequest)request).getSession();

     System.out.println("过滤器1工作,请求转下一个处理..");
     out.print("<br>请求到达目标资源前过滤器2添加的信息<br>");

     String loginStatus=(String)session.getAttribute("loginName");
     if(loginStatus==null)
       {
     	    out.print("<br>你没有登陆,无房访问资源!<br>");
     	    return;
     	  }
     else
         chain.doFilter(request, response);	 

    System.out.println("目标资源输出信息返回到过滤器1...");
    out.print("<br>目标资源输出信息返回时过滤器2添加的信息<br>"); 

  }
}</span></span>

(2)编译Filter1程序,成功后,Filter1.class文件会被JC4自动存放至c:\tomcat\webapps\ROOT\WEB-INF\classes文件夹下,用“我的电脑”查看并核实。

(3)启动JC4,新建一个类“Filter2”,在代码编辑窗口中输入如下的代码:

<span style="font-family:SimSun;"><span style="font-family:FangSong_GB2312;font-size:14px;">package my;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class Filter2 implements Filter {

  private FilterConfig config = null;

  public void init(FilterConfig config) throws ServletException {
    this.config = config;
  }

  public void destroy() {
    config = null;
  }

  public void doFilter(ServletRequest request, ServletResponse response,
                     FilterChain chain) throws IOException, ServletException
 {
        response.setCharacterEncoding("GB2312");
        PrintWriter out=response.getWriter();

        System.out.println("过滤器2工作,请求转下一个处理..");
        out.print("<br>请求到达目标资源前过滤器2添加的信息<br>");

        chain.doFilter(request, response);	

        </span><pre name="code" class="java"><span style="font-family:FangSong_GB2312;font-size:14px;"> <span style="white-space:pre">	</span>System.out.println("目标资源输出信息返回到过滤器2...");
        out.print("<br>目标资源输出信息返回时过滤器2添加的信息<br>"); </span></span>

}}


(4)编译Filter2程序。 (5)启动JC4,新建一个类 “Filter3”,在代码编辑窗口中输入如下的代码:

<span style="font-family:SimSun;"><span style="font-family:FangSong_GB2312;font-size:14px;">package my;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class Filter3 implements Filter {

  private FilterConfig config = null;

  public void init(FilterConfig config) throws ServletException {
    this.config = config;
  }

  public void destroy() {
    config = null;
  }

  public void doFilter(ServletRequest request, ServletResponse response,
                     FilterChain chain) throws IOException, ServletException
 {
       </span><pre name="code" class="java"><span style="font-family:FangSong_GB2312;font-size:14px;"><span style="white-space:pre">	</span>System.out.println("过滤器3工作,请求转下一个处理..");
        out.print("<br>请求到达目标资源前过滤器3添加的信息<br>");

        chain.doFilter(request, response);	

        </span><pre name="code" class="java"><span style="font-family:FangSong_GB2312;font-size:14px;"> <span>	</span>System.out.println("目标资源输出信息返回到过滤器3...");
        out.print("<br>目标资源输出信息返回时过滤器3添加的信息<br>"); </span></span>

}}


(6)编译Filter3程序。

(7)部署以上三个过滤器,得到一个过滤器链为:过滤器3→过滤器1→过滤器2。

编辑WEB-INF\web.xml文件,添加如下的部署信息:

(8)定义实验用JSP资源。启动DW8,完成以下任务:

新建exam406.jsp,在设计视图中输入提示文字“当前是/exam406.jsp 资源”。

新建exam407.jsp,在代码视图中输入以下代码:

<body>

<%

session.setAttribute("loginName","tom");

out.print("成功登录,可以访问/test下的资源了!");

%>

</body>

新建exam408.jsp,在设计视图中,将站点中的“ROOT\tomcat.gif”图片插入文档中。

在站点根文件夹下新建一个/test下级文件夹。

在/test文件夹下建立一个index.jsp文件,在设计视图中输入提示文字“/test的首页”。

新建exam409.jsp,在代码视图中输入以下代码:

<body>

<%

RequestDispatcher go=application.getRequestDispatcher("/exam406.jsp");

go.forward(request,response);

%>

</body>

(9)启动Tomcat,自行完成测试即可。

时间: 2024-08-25 20:24:34

Servlet之过滤器Filter详解的相关文章

【甘道夫】HBase(0.96以上版本)过滤器Filter详解及实例代码

说明: 本文参考官方Ref Guide,Developer API和众多博客,并结合实测代码编写,详细总结HBase的Filter功能,并附上每类Filter的相应代码实现. 本文尽量遵从Ref Guide中"9.4. Client Request Filters"的行文顺序,便于读者对比查看,但内容比官方文档更加详实. 欢迎转载,请注明来源: http://blog.csdn.net/u010967382/article/details/37653177 目录: 引言 -- 参数基础

Servlet中的过滤器Filter详解

转自: http://blog.csdn.net/sd0902/article/details/8395641 web.xml中元素执行的顺序listener->filter->struts拦截器->servlet. 1.过滤器的概念 Java中的Filter 并不是一个标准的Servlet ,它不能处理用户请求,也不能对客户端生成响应. 主要用于对HttpServletRequest 进行预处理,也可以对HttpServletResponse 进行后处理,是个典型的处理链. 优点:过滤

过滤器Filter详解

Filter称之为过滤器: WEB开发人员通过Filter技术,对web服务器管理的所有web资源: 例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能. 例如实现URL级别的权限访问控制.过滤敏感词汇.压缩响应信息等一些高级功能. Filter简介: Servlet API中提供了一个Filter接口,开发web应用时, 如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter. 通过Filter技术,开发人员可以实现用户

AngularJS 过滤器(Filter) 详解

过滤器(Filter),故名思议,源数据通过特定的规则,转换成需要的数据格式, 这个规则,我们统称为过滤器. AngularJs 的Filter 功能非常强大,并且使用方便.它能够使得页面分组,查询,排序,以及数据转换等操作变的异常简单,同时还可以自定义过滤器实现更复杂的功能. 格式:{{expression | filter}} 或 {{expression | filter1 | filter2 | filter3......}} 或者 {{ expression | filter:argu

HBase(0.96以上版本)过滤器Filter详解及实例代码

说明: 本文参考官方Ref Guide,Developer API和众多博客,并结合实测代码编写,详细总结HBase的Filter功能,并附上每类Filter的相应代码实现. 本文尽量遵从Ref Guide中"9.4. Client Request Filters"的行文顺序,便于读者对比查看,但内容比官方文档更加详实. ***2014年7月18日更新,新增PageFilter和SkipFilter.*** 目录: 引言 -- 参数基础 1. 结构(Structural)过滤器--Fi

开启 J2EE(六)— Servlet之Filter详解及乱码处理实例

定义和功能 Filter:过滤器,它能够在request到达Servlet之前预处理request,也可以在离开Servlet时处理response,通过对request或response的处理已达到过滤功能.但是Filter只是对request和response请求进行了拦截处理,通常不产生请求或者响应. 实现的接口 我们写Servlet需要继承一个类,Filter也一样,要实现一个接口(扩展性的体现啊):javax.servlet.Filter,并实现该接口的三个方法: <span styl

布隆过滤器(Bloom Filter)详解

布隆过滤器(Bloom Filter)详解 2012-07-13 18:35 by Haippy, 29358 阅读, 6 评论, 收藏, 编辑   布隆过滤器[1](Bloom Filter)是由布隆(Burton Howard Bloom)在1970年提出的.它实际上是由一个很长的二进制向量和一系列随机映射函数组成,布隆过滤器可以用于检索一个元素是否在一个集合中.它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率(假正例False positives,即Bloom Fi

java web之Filter详解

java web之Filter详解 2012-10-20 0 个评论 作者:chenshufei2 收藏 我要投稿 .概念: Filter也称之为过滤器,它是Servlet技术中比较激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能.例如实现URL级别的权限访问控制.过滤敏感词汇.压缩响应信息等一些高级功能. 二.Filter简介 Servlet API中提供

JAVA学习篇--javaweb之Filter详解

在DRP项目中,多次提到了Filter,它解决了字符集的统一设置以及统一控制简单WebCache,从中我们可以体会到,它给我们带来的好处不仅仅是减少代码量这么简单,它的出现避免了我们每个页面重复的编写相同的代码,减少了我们的工作量,而且给维护带来了极大的便利,那么它是如何实现统一管理的呢?既然它能统一管理某些重复的操作,那么它和AOP有什么关系呢? Filter简介 ServletAPI中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过