在一个Web应用程序中可以注册多个Filter程序,每个Filter程序都可以针对某一个URL进行拦截。如果多个Filter程序都对同一个URL进行拦截,那么这些Filter就会组成一个Filter链(也叫过滤器链)。Filter链用FilterChain对象来表示,FilterChain对象中有一个doFilter()方法,该方法作用就是让Filter链上的当前过滤器放行,请求进入下一个Filter,接下来通过一个图例来描述Filter链的拦截过程,如图1所示。

图1 Filter链

在图1中,当浏览器访问Web服务器中的资源时需要经过两个过滤器Filter1和Filter2,首先Filter1会对这个请求进行拦截,在Filter1过滤器中处理好请求后,通过调用Filter1的doFilter()方法将请求传递给Filter2,Filter2将用户请求处理后同样调用doFilter()方法,最终将请求发送给目标资源。当Web服务器对这个请求做出响应时,也会被过滤器拦截,这个拦截顺序与之前相反,最终将响应结果发送给客户端。

为了让读者更好的学习Filter链,接下来,通过一个案例,分步骤演示如何使用Filter链拦截MyServlet的同一个请求,具体如下:

(1)在chapter04工程的cn.itcast.chapter04.filter包中新建MyFilter01和MyFilter02,如例1和2所示。

例1 MyFilter01.java

1 package cn.itcast.chapter04.filter;

2 import java.io.*;

3 import javax.servlet.*;

4 public class MyFilter01 implements Filter {

5 public void destroy() {

6 // 过滤器对象在销毁时自动调用,释放资源

7 }

8 public void doFilter(ServletRequest request, ServletResponse response,

9 FilterChain chain) throws IOException, ServletException {

10 // 用于拦截用户的请求,如果和当前过滤器的拦截路径匹配,该方法会被调用

11 PrintWriter out=response.getWriter();

12 out.write("Hello MyFilter01");

13 chain.doFilter(request, response);

14 }

15 public void init(FilterConfig fConfig) throws ServletException {

16 // 过滤器对象在初始化时调用,可以配置一些初始化参数

17 }

18 }

例2 MyFilter02.java

1 package cn.itcast.chapter04.filter;

2 import java.io.*;

3 import javax.servlet.Filter;

4 import javax.servlet.*;

5 public class MyFilter02 implements Filter {

6 public void destroy() {

7 // 过滤器对象在销毁时自动调用,释放资源

8 }

9 public void doFilter(ServletRequest request, ServletResponse response,

10 FilterChain chain) throws IOException, ServletException {

11 // 用于拦截用户的请求,如果和当前过滤器的拦截路径匹配,该方法会被调用

12 PrintWriter out=response.getWriter();

13 out.write("MyFilter02 Before");

14 chain.doFilter(request, response);

15 out.write("MyFilter02 After");

16 }

17 public void init(FilterConfig fConfig) throws ServletException {

18 // 过滤器对象在初始化时调用,可以配置一些初始化参数

19 }

20 }

(2)在web.xml文件中将MyFilter01和MyFilter02注册在MyServlet前面,具体如下所示:

MyFilter01

cn.itcast.chapter04.filter.MyFilter01

MyFilter01

/MyServlet

MyFilter02

cn.itcast.chapter04.filter.MyFilter02

MyFilter02

/MyServlet

MyServlet

cn.itcast.chapter04.filter.MyServlet

MyServlet

/MyServlet

(3)重新启动Tomcat服务器,在浏览器地址栏中输入http://localhost:8080/chapter04/MyServlet,此时,浏览器窗口中的显示结果如图2所示。

从图2中可以看出,MyServlet首先被MyFilter01拦截了,打印出MyFilter01中的内容,然后被MyFilter02拦截,直到 MyServlet被MyFilter02放行后,浏览器才显示出MySerlvet中的输出内容。

需要注意的是,Filter链中各个Filter的拦截顺序与它们在web.xml文件中元素的映射顺序一致,由于MyFilter01的元素位于MyFilter02的元素前面,因此用户的访问请求首先会被MyFilter01拦截,然后再被MyFilter02拦截。

猜你喜欢:

什么是filter?filter是用来做什么的?

java web filter链_filter过滤链:Filter链是如何构建的?相关推荐

  1. java web 启动顺序_JavaWeb开发Servlet过滤器链执行顺序详解

    ***第一份手记*** 下午时间观看老师讲的视频,自己动手实践练习得出的结论,讲其分享出来给大家,不喜勿喷,有那里说的不对讲得不好还请大家一一指出,谢谢! 过滤器链的执行顺序是服务器按照web.xml ...

  2. Java Web学习总结(37)——Filter和Listener详解

    在基于Java-Web核心技术的开发应用中,为了一些特定的用途或目的,那么Filter和Listener就要闪亮登场了.那么这次的学习,就来聊一聊Serv-let规范中的另俩技术的核心知识点,即过滤器 ...

  3. java实现筛选_教你用Java web实现多条件过滤功能

    生活中,当你闲暇之余浏览资讯的时候,当你搜索资料但繁杂信息夹杂时候,你就会想,如何更为准确的定位需求信息.今天就为你带来: 分页查询 需求分析:在列表页面中,显示指定条数的数据,通过翻页按钮完成首页/ ...

  4. Java Web之过滤器的简单创建

    Java Web开发中 的过滤器 ( filter ) 是 从Servlet 2.3规范开始增加 的 功能 , 并在Servlet 2.4规范中得到增强. 对Web应用来说 ,过滤器是 一个驻留在服务 ...

  5. 带源码下载—校园表白墙—基于Java Web,Mysql,jsp—设计报告分享

    项目代码路径下载:https://download.csdn.net/download/weixin_42868605/20686663 1.系统功能说明: 发布新的表白墙消息. 删除自己发的消息. ...

  6. java web filter 入口_springboot 通过@WebFilter(urlPatterns )配置Filter过滤路径

    前言 以往的javaEE增加Filter是在web.xml中配置,然而spring-boot中很明显不能这样实现,那怎么办呢?看完下面的教程,答案自然知道了. 前言 传统的javaEE增加Filter ...

  7. Java web—Servlet过滤器(Filter)

    前言:         过滤器是Servlet中一个非常重要的组成部分,进行WEB开发时无不用到过滤器:因此这篇blog来单独总结下关于过滤器的知识点. 一.首先来了解一下什么是过滤器: 下面这句话引 ...

  8. java web filter 之一 基础实现

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

  9. Java Web 项目入门指南(http、Servlet、Request、Response、ServletContext、会话技术[cookie、session]、Filter、Listener)

    概述 web 服务器.项目.资源概述 web 服务器:可以被浏览器访问到的服务器 常见的 web 服务器: tomcat:中小型的服务器软件,免费开源,支持 JSP 和 Servlet apache ...

最新文章

  1. php smarty 序号,php – Smarty缩进和代码格式
  2. html select不能修改,更改HTML Select元素的选定选项
  3. java 泛型 `List<Object>` 和`List<String>`
  4. linux socket recv函数如何判断收完一包_linux服务器端编程之高性能服务器架构设计总结...
  5. Java Applet 问题汇总
  6. 深度学习框架中的魔鬼:探究人工智能系统中的安全问题
  7. memcache/memcached/memcachedb 配置、安装
  8. PCIe device tree range属性详解
  9. 2023南京工业大学计算机考研信息汇总
  10. win7如何设置通电自动开机_老司机处理win7系统电脑自动开机设置的详细步骤【图文】...
  11. win7系统提示此windows副本不是正版怎么办?
  12. 读了本书《3000美金,我周游了世界》
  13. 怎么使用电脑打开手机分享的vcf联系人文件
  14. html设置本地字体文件
  15. mysql 1556_mysqldump: Got error: 1556: You can't use locks with log tables.解决办法
  16. SELECT TOP 1 * FROM是什么意思
  17. python实现千牛客服自动回复语_千牛客服自动回复话术
  18. 小组项目--闲置物品交换系统-第一周
  19. 国家宝藏第三季开篇神级文案
  20. 石墨笔记,Ulysses,Effie,影评人该选什么样的文字编辑应用?

热门文章

  1. PLSQL 日期格式修改
  2. Docker实战(精简版本)
  3. 封装一个邮件发送工具类,一个字,巴适
  4. oracle数据库触发器删除不,Oracle之后删除触发器
  5. php mysql变量赋值给变量_MySQL_mysql 存储过程中变量的定义与赋值操作,一、变量的定义 mysql中变量定 - phpStudy...
  6. jvm调优 java_opt_Java-100天知识进阶-JVM调优工具-JDK自带工具-知识铺《八》
  7. BugkuCTF-MISC题Pokergame
  8. vuex modules ajax,VUE项目爬坑---6、vuex的真正存在的意义是什么
  9. 模糊匹配查询_必须掌握的6个查询函数应用技巧,办公必备,收藏备用!
  10. Linux命令行下统计当前文件夹下的文件个数