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

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

c79d5ffdb5f4477e2c8489b0d8e0c6ff.png

图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所示。

dc4b7cca29b75908a71fc9c23205a194.png

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

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

猜你喜欢:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/532344.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java web 应用技术与案例教程_《Java Web应用开发技术与案例教程》怎么样_目录_pdf在线阅读 - 课课家教育...

出版说明前言第1章 java Web应用开发技术概述1.1 Java Web应用开发技术简介1.1.1 Java Web应用1.1.2 Java Web应用开发技术1.2 Java Web开发环境及开发工具1.2.1 JDK的下载与安装1.2.2 Tomcat服务器的安装和配置1.2.3 MyEclipse集成开发工具的安装与操作1.3 Java Web应用程序的…

java环境变量自动设置_自动设置Java环境变量

echo offSETLOCALENABLEDELAYEDEXPANSIONfor /f "tokens2* delims " %%i in(reg query "HKLM\Software\JavaSoft\Java Development Kit" /s ^|find /I"JavaHome") do (echo 找到目录 %%jset /p isOK该目录是不是JDK^(JavaDevelopment Kit^)的安装…

mysql运行状态监控研究内容_如何监控mysql主从的运行状态shell脚本实例介绍

如何监控mysql主从的运行状态shell脚本实例介绍。#!/bin/bash#define mysql variablemysql_user”root”mysql_pass”123456″email_addr”slavecentos.bz”mysql_statusnetstat -nl | awk ‘NR>2{if ($4 ~ /.*:3306/) {print “Yes”;exit 0}}’if [ "$mysql_status&q…

java 100% cpu_Java服务,CPU 100%问题如何快速定位?

Java服务,有时候会遇到CPU 100%的问题,对于这样的问题,我们如何快速定位并解决呢?一般会有如下三个步骤:1、找到最耗CPU的进程2、找到这个进程中最耗CPU的线程3、查看堆栈信息,定位线程的什么操作消耗了大量…

java 泛型 加_Java泛型并将数字加在一起

为了一般地计算总和,您需要提供两个动作:>一种总计零项的方法>一种总结两个项目的方法在Java中,您可以通过界面完成.这是一个完整的例子:import java.util.*;interface adder {T zero(); // Adding zero itemsT add(T lhs, T rhs); // Adding two …

java 字母金字塔_LeetCode756:金字塔转换矩阵(JAVA题解)

题目描述现在,我们用一些方块来堆砌一个金字塔。 每个方块用仅包含一个字母的字符串表示。使用三元组表示金字塔的堆砌规则如下:对于三元组(A, B, C) ,“C”为顶层方块,方块“A”、“B”分别作为方块“C”下一层的的左、右子块。当…

java final static_Java基础之final、static关键字

一、前言关于这两个关键字,应该是在开发工作中比较常见的,使用频率上来说也比较高。接口中、常量、静态方法等等。但是,使用频繁却不代表一定是能够清晰明白的了解,能说出个子丑演卯来。下面,对这两个关键字的常见用法…

docker mysql57_docker安装mysql57

提高应用交付效率mysql1. 支持服务发现,避免服务重启迁移 IP 变动带来影响;2. 支持微服务化,下降代码维护及重构复杂度,适应快速变化的业务需求。sql快速响应业务变化docker1. 灵活水平扩展,应对业务量的骤然变化&…

java删除csv一行_在Java中读取CSV文件时跳过第一行

嘿家伙我正在编写解析器代码来读取.csv文件并将其解析为XML.这是我的代码,它工作正常,但我希望它跳过文件中的第一行.所以我决定设置一个HashMap,但它似乎确实有效&#xff1a;for (int i 0; i < listOfFiles.length; i) {File file listOfFiles[i];if (file.isFile() &am…

java语言错误的是解释运行的_Java基础知识测试__A卷_答案

考试宣言:同学们, 考试考多少分不是我们的目的! 排在班级多少的名次也不是我们的初衷!我的考试的目的是要通过考试中的题目,检查大家在这段时间的学习中,是否已经把需要掌握的知识掌握住了,如果哪道题目你不会做,又或者做错了, 那么不用怕, 考完试后, 导师讲解的时候你要注意听…

java 持续集成工具_Jenkins-Jenkins(持续集成工具)下载 v2.249.2官方版--pc6下载站

Jenkins是一款基于java开发的持续集成工具&#xff0c;是一款开源软件&#xff0c;主要用于监控持续重复的工作&#xff0c;为开发者提供一个开发易用的软件平台&#xff0c;使软件的持续集成变成可能。。相关软件软件大小版本说明下载地址Jenkins是一款基于java开发的持续集成…

java中number类型能否相除_Java中 如果复数类成员是int型,怎么实现两个复数相除...

(1) 复数类Complex 的属性有&#xff1a;RealPart : int型&#xff0c;代表复数的实数部分ImaginPart : int型&#xff0c;代表复数的虚数部分package applet;import java.applet.*;import java.awt.*;public class j_1 extends Applet{Complex a,b,c,d,e,f;public void in…

java中线程调度遵循的原则_深入理解Java多线程核心知识:跳槽面试必备

多线程相对于其他 Java 知识点来讲&#xff0c;有一定的学习门槛&#xff0c;并且了解起来比较费劲。在平时工作中如若使用不当会出现数据错乱、执行效率低(还不如单线程去运行)或者死锁程序挂掉等等问题&#xff0c;所以掌握了解多线程至关重要。本文从基础概念开始到最后的并…

java禁止js获取cookie_java中Cookie被禁用后Session追踪问题

一.服务器端获取Session对象依赖于客户端携带的Cookie中的JSESSIONID数据。如果用户把浏览器的隐私级别调到最高&#xff0c;这时浏览器是不会接受Cookie、这样导致永远在服务器端都拿不到的JSESSIONID信息。这样就导致服务器端的Session使用不了。Java针对Cookie禁用&#xff…

java类构造方法成员方法练习_面向对象方法论总结 练习(一)

原标题&#xff1a;面向对象方法论总结 & 练习(一)学习目标1.面向对象与面向过程2.类与对象的概念3.类的定义&#xff0c;对象的创建和使用4.封装5.构造方法6.方法的重载内容1.面向对象与面向过程为什么会出现面向对象反分析方法&#xff1f;因为现实世界太复杂多变&#x…

mysql 统计查询不充电_MySql查询语句介绍,单表查询,来充电吧

mysql在网站开发中&#xff0c;越来越多人使用了&#xff0c;方便部署&#xff0c;方便使用。我们要掌握mysql,首先要学习查询语句。查询单个表的数据&#xff0c;和多个表的联合查询。下面以一些例子来先简单介绍下单表查询。操作方法01首先看下我们例子用到的数据表&#xff…

MySQL线上优化_线上MySQL千万级大表,如何优化?

前段时间应急群有客服反馈&#xff0c;会员管理功能无法按到店时间、到店次数、消费金额进行排序。经过排查发现是 SQL 执行效率低&#xff0c;并且索引效率低下。图片来自 Pexels应急问题商户反馈会员管理功能无法按到店时间、到店次数、消费金额进行排序&#xff0c;一直转圈…

java底层怎么学_java学习----底层原理一

数据类型java自带8种基本类型&#xff0c;4中整型类型&#xff0c;2种浮点类型&#xff0c;1种用于表示Unicode编码的字符单元的字符类型&#xff0c;和1种用于表示真值的bool类型(这8种基本类型都有自己的隐式初始值)。long在申请变量时赋值数据后必须加l或L&#xff0c;若不加…

java实验报告合肥工业大学_合肥工业大学数据结构上机实验代码与实验报告(全)github地址...

C&plus;&plus;实现链队类——合肥工业大学数据结构实验5&#xff1a;链式队列实验5 5.1 实验目的 熟练掌握队列的顺序链式存储结构. 熟练掌握队列的有关算法设计,并在链队列上实现. 根据具体给定的需求,合理设计并实现相关结构和算法. 5.2 实验要求 5.2.1链队列实验要 …

php 类分开写,自己前几天写的无限分类类_PHP教程

自己前几天写的无限分类类_PHP教程前一周写的吧&#xff0c;使用中效果还不错。主要思想来自&#xff1a;http://www.phpobject.net/b...[urlhttp://www.phpobject.net/blog/read.php?49][/url]这里就不多解释原理了&#xff0c;直接发代码。PS:这里代码是不能直接使用的&…