java web filter链_filter过滤链:Filter链是如何构建的?
在一个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链是如何构建的?相关推荐
- java web 启动顺序_JavaWeb开发Servlet过滤器链执行顺序详解
***第一份手记*** 下午时间观看老师讲的视频,自己动手实践练习得出的结论,讲其分享出来给大家,不喜勿喷,有那里说的不对讲得不好还请大家一一指出,谢谢! 过滤器链的执行顺序是服务器按照web.xml ...
- Java Web学习总结(37)——Filter和Listener详解
在基于Java-Web核心技术的开发应用中,为了一些特定的用途或目的,那么Filter和Listener就要闪亮登场了.那么这次的学习,就来聊一聊Serv-let规范中的另俩技术的核心知识点,即过滤器 ...
- java实现筛选_教你用Java web实现多条件过滤功能
生活中,当你闲暇之余浏览资讯的时候,当你搜索资料但繁杂信息夹杂时候,你就会想,如何更为准确的定位需求信息.今天就为你带来: 分页查询 需求分析:在列表页面中,显示指定条数的数据,通过翻页按钮完成首页/ ...
- Java Web之过滤器的简单创建
Java Web开发中 的过滤器 ( filter ) 是 从Servlet 2.3规范开始增加 的 功能 , 并在Servlet 2.4规范中得到增强. 对Web应用来说 ,过滤器是 一个驻留在服务 ...
- 带源码下载—校园表白墙—基于Java Web,Mysql,jsp—设计报告分享
项目代码路径下载:https://download.csdn.net/download/weixin_42868605/20686663 1.系统功能说明: 发布新的表白墙消息. 删除自己发的消息. ...
- java web filter 入口_springboot 通过@WebFilter(urlPatterns )配置Filter过滤路径
前言 以往的javaEE增加Filter是在web.xml中配置,然而spring-boot中很明显不能这样实现,那怎么办呢?看完下面的教程,答案自然知道了. 前言 传统的javaEE增加Filter ...
- Java web—Servlet过滤器(Filter)
前言: 过滤器是Servlet中一个非常重要的组成部分,进行WEB开发时无不用到过滤器:因此这篇blog来单独总结下关于过滤器的知识点. 一.首先来了解一下什么是过滤器: 下面这句话引 ...
- java web filter 之一 基础实现
本文主要对filter的基本使用进行了讲解,其中涉及到了 filter是什么 一个filter处理一个jsp 多个filter处理一个jsp filter是什么 Filter 是java下的一种过滤器 ...
- Java Web 项目入门指南(http、Servlet、Request、Response、ServletContext、会话技术[cookie、session]、Filter、Listener)
概述 web 服务器.项目.资源概述 web 服务器:可以被浏览器访问到的服务器 常见的 web 服务器: tomcat:中小型的服务器软件,免费开源,支持 JSP 和 Servlet apache ...
最新文章
- php smarty 序号,php – Smarty缩进和代码格式
- html select不能修改,更改HTML Select元素的选定选项
- java 泛型 `List<Object>` 和`List<String>`
- linux socket recv函数如何判断收完一包_linux服务器端编程之高性能服务器架构设计总结...
- Java Applet 问题汇总
- 深度学习框架中的魔鬼:探究人工智能系统中的安全问题
- memcache/memcached/memcachedb 配置、安装
- PCIe device tree range属性详解
- 2023南京工业大学计算机考研信息汇总
- win7如何设置通电自动开机_老司机处理win7系统电脑自动开机设置的详细步骤【图文】...
- win7系统提示此windows副本不是正版怎么办?
- 读了本书《3000美金,我周游了世界》
- 怎么使用电脑打开手机分享的vcf联系人文件
- html设置本地字体文件
- mysql 1556_mysqldump: Got error: 1556: You can't use locks with log tables.解决办法
- SELECT TOP 1 * FROM是什么意思
- python实现千牛客服自动回复语_千牛客服自动回复话术
- 小组项目--闲置物品交换系统-第一周
- 国家宝藏第三季开篇神级文案
- 石墨笔记,Ulysses,Effie,影评人该选什么样的文字编辑应用?
热门文章
- PLSQL 日期格式修改
- Docker实战(精简版本)
- 封装一个邮件发送工具类,一个字,巴适
- oracle数据库触发器删除不,Oracle之后删除触发器
- php mysql变量赋值给变量_MySQL_mysql 存储过程中变量的定义与赋值操作,一、变量的定义 mysql中变量定 - phpStudy...
- jvm调优 java_opt_Java-100天知识进阶-JVM调优工具-JDK自带工具-知识铺《八》
- BugkuCTF-MISC题Pokergame
- vuex modules ajax,VUE项目爬坑---6、vuex的真正存在的意义是什么
- 模糊匹配查询_必须掌握的6个查询函数应用技巧,办公必备,收藏备用!
- Linux命令行下统计当前文件夹下的文件个数