过滤器导图详解

过滤器是web开发中常用的开发方式,比如一些典型的应用场景:

用户身份认证、对用户请求进行记录和审核、对用户发送的数据进行替换和过滤、转换图像格式、对响应内容压缩、加密请求或响应等等。

本篇就了解下监听器的主要使用方法。

 

什么是过滤器?

  过滤器的生命周期

  过滤器的生命周期与web容器相同,当web容器启动时,就会读取应用的web.xml配置文件,如果这里配置了过滤器,容器就会执行实例化,并调用过滤器的init方法。

  之后用户的每一次请求都会执行过滤器的doFilter方法。

  当web容器销毁时,就会执行destroy方法,释放资源。

  过滤器的执行过程

  过滤器看名字就能知道大概的用法,它就像一个筛子,可以筛选特定的数据或请求。执行过程如下图所示:

  用户在发送请求后,如果该请求满足过滤器的过滤规则,web容器就会执行过滤器中的doFilter方法进行特定的操作;然后通过调用FilterChain.doFilter转交给web容器。web容器执行完成后把资源返回给过滤器,再展现给用户。

 

简单的过滤器实例

  下面通过一个简单的代码,看看过滤器的编写。

  首先,需要创建一个过滤器,过滤器集成javax.servlet.Filter接口,其中必须实现三个方法:init() doFilter() destroy()

public class MyFilter implements Filter{
    public void destroy() {
        System.out.println("MyFilter destroy");
    }
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        System.out.println("MyFilter start...dofilter");
        chain.doFilter(request, response);//对请求放行
        System.out.println("MyFilter end...dofilter");
    }
    public void init(FilterConfig arg0) throws ServletException {
        System.out.println("MyFilter init");
    }
}

  init()方法是在web容器实例化过滤器时调用的。

  doFilter()方法是每次有请求,且满足过滤规则时调用。

  destroy()方法是web容器关闭时,调用。

  然后,在web.xml中配置相应的选项。如果是servlet3.0,那么支持注解的方式配置过滤器。

<filter>
      <filter-name>MyFilter</filter-name>
      <filter-class>com.test.filter.MyFilter</filter-class>
</filter>
<filter-mapping>
      <filter-name>MyFilter</filter-name>
      <url-pattern>/index.jsp</url-pattern>
        <!--<dispatcher></dispatcher>-->
</filter-mapping>

  其中几个必备的项:

  在<filter>中配置了过滤器,filter-name是过滤器的名字,filter-class是过滤器的类;

  在<filter-mapping>中配置了过滤器的映射规则,filter-name是过滤器的名字,url-pattern是过滤的规则,dispatcher是过滤器的分类(主要包括四种,稍后讲解)

  这里先说下过滤器的规则,如果想要全部的请求都过滤,那么可以写/*

  如果想要过滤index.jsp  index.html 可以写/index*

  如果只想过滤index.jsp,可以写成/index.jsp

 

  其次,配置好后,创建index.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
    This is Filter JSP!
    <%
        System.out.println("index jsp");
    %>
</body>
</html>

  

  最后,当启动web容器后,可以在控制台中发现,初始化时,执行了init方法

  访问对应的web资源,可以看到控制台按照执行的顺序打印消息:

多个过滤器操作

  多个过滤器执行与上面差不多。

  在上面代码的基础上,再增加一个过滤器:

public class SecondFilter implements Filter{
    public void destroy() {
        System.out.println("SecondFilter destroy()");
    }
    public void doFilter(ServletRequest arg0, ServletResponse arg1,
            FilterChain chain) throws IOException, ServletException {
        System.out.println("SecondFilter doFilter start");
        chain.doFilter(arg0, arg1);
        System.out.println("SecondFilter doFilter end");
    }

    public void init(FilterConfig arg0) throws ServletException {
        System.out.println("SecondFilter init()");
    }
}

  在web.xml中增加过滤器配置

  <filter>
      <filter-name>SecondFilter</filter-name>
      <filter-class>com.test.filter.SecondFilter</filter-class>
  </filter>
  <filter-mapping>
      <filter-name>SecondFilter</filter-name>
      <url-pattern>/index.jsp</url-pattern>
  </filter-mapping>

  启动web容器,控制台输出init信息

  访问页面,可以看到由于在web.xml中映射配置MyFilter在SecondFilter上面,

  因此输出如下消息:

 

  类似的,如果把SecondFilter配置放在上面,就会先执行SecondFilter的doFilter方法。

过滤器的分类

  最后看一下过滤器的分类,过滤器主要包括四种,REQUEST\FORWARD\INCLUDE\ERROR(3.0额外新增了一个异步请求ASYNC)。

  上面的过滤器都是采用REQUEST的方式,直接请求。由于没有配置dispathcer,默认就会按照REQUEST的方式进行。

  直接看一下FORWARD的使用方法,在doFilter中执行下面的方法:

public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        System.out.println("MyFilter start...dofilter");
        HttpServletRequest req = (HttpServletRequest)request;
        req.getRequestDispatcher("main.jsp").forward(request, response);
        System.out.println("MyFilter end...dofilter");
}

  此时页面请求就会直接跳转到main.jsp,触发FORWARD类型过滤器,过滤器配置选项如下:

  <filter>
      <filter-name>MyFilter</filter-name>
      <filter-class>com.test.filter.MyFilter</filter-class>
  </filter>
  <filter-mapping>
      <filter-name>MyFilter</filter-name>
      <url-pattern>/index.jsp</url-pattern>
  </filter-mapping>
  <filter>
      <filter-name>SecondFilter</filter-name>
      <filter-class>com.test.filter.SecondFilter</filter-class>
  </filter>
<!--     <filter-mapping>
      <filter-name>SecondFilter</filter-name>
      <url-pattern>/index.jsp</url-pattern>
  </filter-mapping> -->
  <filter-mapping>
      <filter-name>SecondFilter</filter-name>
      <url-pattern>/main.jsp</url-pattern>
      <dispatcher>FORWARD</dispatcher>
  </filter-mapping>

  启动后发现,原本请求Index.jsp跳转到了main.jsp。

  此时,如果第二个过滤器采用的是REQUEST,就不会触发了。

  另外,还可以使用JSP页面标签,执行跳转,此时过滤器也可以触发。比如在JSP页面中添加<jsp:forward>标签

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>

<jsp:forward page="/main.jsp"></jsp:forward>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>

</body>
</html>

  INCLUDE与FORWARD类似,使用方法也相同,只是名字不同而已,就不做过多的介绍了。

  然后看一下ERROR过滤器,通常我们会在web.xml中配置错误页面,如下:

<error-page>
      <error-code>404</error-code>
    <location>/error.jsp</location>
  </error-page>

  此时,如果访问不存在的页面,http://localhost:8080/xxx.jsp就会跳转到error.jsp

  此时如果过滤器通过REQUEST方式,想要触发,url填写的是/error.jsp并不会起作用,此时就需要把dispathcer改成 ERROR,并且放置在error-page标签下面:

  <error-page>
      <error-code>404</error-code>
    <location>/error.jsp</location>
  </error-page>
  <!-- 需要放在errorpage下面 -->
  <filter>
      <filter-name>ErrorFilter</filter-name>
      <filter-class>com.test.filter.ErrorFilter</filter-class>
  </filter>
  <filter-mapping>
      <filter-name>ErrorFilter</filter-name>
      <url-pattern>/error.jsp</url-pattern>
      <dispatcher>ERROR</dispatcher>
  </filter-mapping>

  这样就会触发ERROR过滤器了。

参考

【1】过滤器的应用:http://www.ylzx8.cn/web/web/979338.html

【2】过滤器视频教程:http://www.imooc.com/learn/213

本文转自博客园xingoo的博客,原文链接:过滤器导图详解,如需转载请自行联系原博主。

时间: 2024-09-28 14:55:10

过滤器导图详解的相关文章

Web监听器导图详解

监听器是JAVA Web开发中很重要的内容,其中涉及到的知识,可以参考下面导图: Web监听器 1 什么是web监听器? web监听器是一种Servlet中的特殊的类,它们能帮助开发者监听web中的特定事件,比如ServletContext,HttpSession,ServletRequest的创建和销毁:变量的创建.销毁和修改等.可以在某些动作前后增加处理,实现监控. 2 监听器常用的用途 通常使用Web监听器做以下的内容: 统计在线人数,利用HttpSessionLisener 加载初始化信

Web监听器导图详解(转)

    阅读目录 Web监听器 监听器的分类 Servlet版本与Tomcat版本 getAttribute与getParameter的区别 参考 监听器是JAVA Web开发中很重要的内容,其中涉及到的知识,可以参考下面导图: 回到顶部 Web监听器 1 什么是web监听器? web监听器是一种Servlet中的特殊的类,它们能帮助开发者监听web中的特定事件,比如ServletContext,HttpSession,ServletRequest的创建和销毁:变量的创建.销毁和修改等.可以在某

UML软件设计基础(UML图详解)

UML软件设计基础(UML图详解) 作为一种建模语言,UML的定义包括UML语义和UML表示法两个部分. (1) UML语义 描述基于UML的精确元模型定义.元模型为UML的所有元素在语法和语义上提供了简单.一致.通用的定义性说明,使开发者能在语义上取得一致,消除了因人而异的最佳表达方法所造成的影响.此外UML还支持对元模型的扩展定义. (2) UML表示法 定义UML符号的表示法,为开发者或开发工具使用这些图形符号和文本语法为系统建模提供了标准.这些图形符号和文字所表达的是应用级的模型,在语义

国外著名网站的眼球热力图、眼球跟踪图详解

现在大家都在谈论网站的用户体验(UE或UX)和界面设计UI等热门话题,techfrom从来对概念本身不是特别关注,更关注实际应用和数据等.去年12月份左右,国外EyeTrackShop通过Mashable发布了一份有关国外几个著名网站和社交网络的用户眼球追踪图或者眼球热力图,尤其是个人信息页面(Profile Page)被浏览时候的热点分部情况.涉及到的被调查的网站包括:Facebook,Google+,LinkedIn,Flickr,Youtube,Klout,Reddit,Digg,Tumb

jquery 实现轮播图详解及实例代码_jquery

轮播图: 接触jquery也有一段时间了,今天刚好利用轮播图来练练手.博文的前面会介绍一个简单用jquery做轮播图的例子,中间会插入一些关于轮播图更多的思考,在后面会用Javascript的方法来写一个轮播图,最后则是关于jquery和Javascript的比较.轮播图的效果可以点击如下链接查看:http://sandbox.runjs.cn/show/t07kscph jquery做轮播图的例子: html部分代码: <!DOCTYPE html> <html> <hea

Excel 2010中格式化波型图详解

本文的波型图按月显示了2008年三个图书供应商的净利润.单独的净利润数值能够告诉哪些供应商做得好,而波型图帮助识别数字后面的趋势:Seattle和Houston在夏季销售量下降,通常它们的利润一直在攀升,而Richmond除了最后一个月外销量一直不佳. 看看三个波型图的格式选项.选择波型图后,功能区中将出现波型图上下文选项卡,与选择图表或数据透视表相似.下面是"波型图工具"上下文选项卡中的格式选项.显示/隐藏和样式: 波型图有一个与图表和表相似的库,可以在其中快速选择颜色方案.波型图的

淘宝宝贝防盗图章怎么做?多图详解淘宝宝贝防盗图章制作方法

各位淘宝的买家卖家大家好.众所周知,一个吸引人驻足停留的淘宝店铺,一个顺利成交的宝贝,不仅在于其物美价廉的本质,图片的美观及真实性更另顾客重视!大家都不想自己辛辛苦苦拍摄及制作出来的照片轻易的就被人家盗用,拿来做他们店铺的"推荐宝贝"吧?!防盗水印社区已经有普遍介绍了,今天我给亲们介绍一款防盗图章,个人觉得放在宝贝里更显得专业,而且适用性广.那今天就跟我一起来学习PS制作"防盗图章"吧!先看一张成品的效果图哈: photoshop教程 可以看到右上角的一个图章&qu

十图详解TensorFlow数据读取机制(附代码)

在学习TensorFlow的过程中,有很多小伙伴反映读取数据这一块很难理解.确实这一块官方的教程比较简略,网上也找不到什么合适的学习材料.今天这篇文章就以图片的形式,用最简单的语言,为大家详细解释一下TensorFlow的数据读取机制,文章的最后还会给出实战代码以供参考. TensorFlow读取机制图解 首先需要思考的一个问题是,什么是数据读取?以图像数据为例,读取数据的过程可以用下图来表示: 假设我们的硬盘中有一个图片数据集0001.jpg,0002.jpg,0003.jpg--我们只需要把

mip-anim动图详解 mip-anim动图怎么用

标题 内容 类型 通用 支持布局 responsive, fixed-height, fixed, container 文档 所需脚本 https://mipcache.bdstatic.com/static/v1/mip-anim/mip-anim.js 示例 带placeholder的加载方式 <mip-anim  layout="fixed" width=210 height=210  src="xxx"  alt="an animation&