FilterChain 过滤器链(Servlet)...修改中...
目录
FilterChain 接口
Filter 链的拦截过程
Filter 链中 Filter 的执行顺序
示例
在 Web 应用中,可以部署多个 Filter,若这些 Filter 都拦截同一目标资源,则它们就组成了一个 Filter 链(也称过滤器链)。过滤器链中的每个过滤器负责特定的操作和任务,客户端的请求在这些过滤器之间传递,直到传递给目标资源。
FilterChain 接口
javax.servlet 包中提供了一个 FilterChain 接口,该接口由容器实现。容器将其实例对象作为参数传入 Filter 对象的 doFilter() 方法中。Filter 对象可以使用 FilterChain 对象调用链中下一个 Filter 的 doFilter() 方法,若该 Filter 是链中最后一个过滤器,则调用目标资源的 service() 方法。FilterChain 接口中只有一个方法,如下表。
返回值类型 | 方法 | 描述 |
---|---|---|
void | doFilter(ServletRequest request ,ServletResponse response) | 使用该方法可以调用过滤器链中的下一个 Filter 的 doFilter() 方法,若该 Filter 是链中最后一个过滤器,则调用目标资源的 service() 方法。 |
在 Filter.doFilter() 方法中调用 FilterChain.doFilter() 方法的语句前后增加某些程序代码,就可以在 Servlet 进行响应前后实现某些特殊功能,例如权限控制、过滤敏感词、设置统一编码格式等。
Filter 链的拦截过程
Filter 链的拦截过程如下图所示。
请求资源时,过滤器链中的过滤器依次对请求进行处理,并将请求传递给下一个过滤器,直到最后将请求传递给目标资源。发送响应信息时,则按照相反的顺序对响应进行处理,直到将响应返回给客户端。
过滤器并不是必须要将请求传递到下一个过滤器或目标资源,它可以自行对请求进行处理,并发送响应给客户端,也可以将请求转发给其他的目标资源。// 可以直接返回资源,不再往后传递
注:过滤器链中的任何一个 Filter 没有调用 FilterChain.doFilter() 方法,请求都不会到达目标资源。
Filter 链中 Filter 的执行顺序
通过 web.xml 配置的 Filter 过滤器,执行顺序由 <filter-mapping> 标签的配置顺序决定。<filter-mapping> 靠前,则 Filter 先执行,靠后则后执行。通过修改 <filter-mapping> 的顺序便可以修改 Filter 的执行顺序。
通过 @WebFilter 注解配置的 Filter 过滤器,无法进行排序,若需要对 Filter 过滤器进行排序,建议使用 web.xml 进行配置。// 但如果需要,修改filter目录中对应过滤器的文件名按首字母顺序调整自己想要的顺序即可!!!
示例
创建名称为 LoginServlet 的类,代码如下。
package swadian.servlet.filter;import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** @author swadian* @date 2022/2/14* @Version 1.0*/
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {private static final long serialVersionUID = 1L;public LoginServlet() {super();}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {//设置向页面输出的格式与编码response.getWriter().write("<h3>LoginServlet 欢迎您 !</h3>");}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {doGet(request, response);}
}
创建名称为 FirstChainFilter 的类,代码如下。
package swadian.servlet.filter;import javax.servlet.DispatcherType;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
import java.io.PrintWriter;/*** @author swadian* @date 2022/2/14* @Version 1.0*/
@WebFilter(dispatcherTypes = {DispatcherType.REQUEST,DispatcherType.FORWARD,DispatcherType.INCLUDE,DispatcherType.ERROR
},urlPatterns = {"/LoginServlet"})
public class FirstChainFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) {}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {//设置向页面输出的格式与编码response.setContentType("text/html;charset=UTF-8");PrintWriter writer = response.getWriter();writer.write("FirstChainFilter 对请求进行处理<br/>");chain.doFilter(request, response);writer.write("FirstChainFilter 对响应进行处理<br/>");}@Overridepublic void destroy() {}
}
创建名称为 SecondChainFilter 的类,代码如下。
package swadian.servlet.filter;import javax.servlet.DispatcherType;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
import java.io.PrintWriter;/*** @author swadian* @date 2022/2/15* @Version 1.0*/
@WebFilter(dispatcherTypes = {DispatcherType.REQUEST,DispatcherType.FORWARD,DispatcherType.INCLUDE,DispatcherType.ERROR
},urlPatterns = {"/LoginServlet"})
public class SecondChainFilter implements Filter {public SecondChainFilter() {}public void destroy() {}public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {//设置向页面输出的格式与编码response.setContentType("text/html;charset=UTF-8");PrintWriter writer = response.getWriter();writer.write("SecondChainFilter 对请求进行处理<br/>");chain.doFilter(request, response);writer.write("SecondChainFilter 对响应进行处理<br/>");}public void init(FilterConfig fConfig) {}
}
启动 Tomcat 服务器,在浏览器地址栏中输入“http://localhost:8080/web/LoginServlet”,结果如下。
附:web.xml 中配置过滤器方式
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"version="3.0"><!--过滤器链中FirstChainFilter配置 --><filter><filter-name>FirstChainFilter</filter-name><filter-class>swadian.servlet.filter.FirstChainFilter</filter-class></filter><filter-mapping><filter-name>FirstChainFilter</filter-name><url-pattern>/LoginServlet</url-pattern></filter-mapping><!--过滤器链中SecondChainFilter配置 --><filter><filter-name>SecondChainFilter</filter-name><filter-class>swadian.servlet.filter.SecondChainFilter</filter-class></filter><filter-mapping><filter-name>SecondChainFilter</filter-name><url-pattern>/LoginServlet</url-pattern></filter-mapping>
</web-app>
FilterChain 过滤器链(Servlet)...修改中...相关推荐
- Filter过滤器的这些内容(Filter的生命周期FilterChain过滤器链Filter的拦截路径...),你都理解了吗?
说说Filter(过滤器),它是javaWeb的三大组件之一,三大组件包括Servlet,Filter,Listener.Servlet前面已经详细说过了,这篇说的是Filter,关于Lis ...
- FilterConfig类及FilterChain过滤器链
FilterConfig是Filter的配置文件类 Tomcat 每次创建Filter类的时候同时会创建一个FilterConfig类 包含了Filter配置文件的配置信息 FilterConfig类 ...
- FilterChain 过滤器链和拦截路径
Filter 过滤器 Chain 链,链条 FilterChain 就是过滤器链(多个过滤器如何一起工作) Filter 的拦截路径 精确匹配: <url-pattern>/target. ...
- Java培训总结:过滤器链的实现方法、配置和案例分析
今天小千给大家分享的是Java培训总结:过滤器链的实现方法.配置和案例分析. 过滤器能够对网站中的各种内容进行过滤(页面.Servlet.图片.文件),可以在网站内容请求和响应时进行一些操作,完成一些 ...
- FilterChain(过滤器链)详解
在一个 Web 应用程序中可以注册多个 Filter 程序,每个 Filter 程序都可以针对某一个 URL 进行拦截.如果多个 Filter 程序都对同一个 URL 进行拦截,那么这些 Filter ...
- Servlet规范中定义的过滤器
文章目录 什么是过滤器 写过滤器的步骤 配置初始化参数 过滤器的优先级 过滤器的优点 过滤器执行过程图解 过滤敏感词的示例代码 使用 Servlet 来过滤敏感词 使用过滤器来过滤敏感词 通过配置初始 ...
- java web 启动顺序_JavaWeb开发Servlet过滤器链执行顺序详解
***第一份手记*** 下午时间观看老师讲的视频,自己动手实践练习得出的结论,讲其分享出来给大家,不喜勿喷,有那里说的不对讲得不好还请大家一一指出,谢谢! 过滤器链的执行顺序是服务器按照web.xml ...
- java filter 调用链_JavaWeb开发Servlet过滤器链执行顺序详解
***第一份手记*** 下午时间观看老师讲的视频,自己动手实践练习得出的结论,讲其分享出来给大家,不喜勿喷,有那里说的不对讲得不好还请大家一一指出,谢谢! 过滤器链的执行顺序是服务器按照web.xml ...
- Servlet→对象监听器、事件监听器、Session钝化活化、@WebListener标注、过滤器概念原理生命周期、过滤器链、@WebFilter标注、定时器Timer、cancel()、purge
监听器ServletContextListener HttpSessionListener ServletRequestListener 事件监听器 Session钝化活化 @WebListener标 ...
最新文章
- 将前500页,和中间500页的CVE编号放在一起
- php获取图高度,PHP imagesx()、imagesy() – 获取图像宽度与高度_程序员人生
- 20181204-1 每周例行报告
- 关于地理信息系统(GIS)的几个问题
- oracle定时任务(dbms_job)
- 3d vision可以卸载吗_金属粉末可以用于3D打印,但这些知识你了解吗?
- codeforces1552 D. Array Differentiation(思维+暴力)
- 使用webService时,gsoap数据类型注意事项
- java中子类实例化过程中的内存分配
- 4个你未必知道的内存小知识
- 20款最优秀的JavaScript编辑器
- css实现文本溢出时显示省略号(单行)
- 路由期末复习(二)—配置命令
- ubuntu16.04,exFAT格式U盘无法打开,离线解决方式
- 用户画像业务数据调研及ETL(二)持续更新中...
- [CSS] css使用first-child 和last-child 实现三条杠效果
- 腾讯可信区块链方案白皮书 QA
- 常用逻辑用语知识点【初级和中阶辅导】
- delta method 介绍
- java获取枚举索引_Java枚举使用详解
热门文章
- iphone11pro市场价_iPhone11 Pro首发真机体验:花这一万元真的值吗?
- 程序员发朋友圈的七种范式
- MATLAB 将 n 美分转换成 25、10、5 和 1 美分的硬币总共有多少种转换方法?编写一个函数,传入参数 n,输出转换的种类
- mysql分区表truncate分区数据_详解MySQL分区表
- tell网关arp包正常吗_网工知识角|如何理解ARP协议?防护有诀窍,网络工程师必读...
- [Mysql] 更新数据
- tmux命令基本使用
- 我的世界服务器自动跳跃,《我的世界》学会2条跳跃指令 加速度超越火箭 轻轻一跳越过256...
- 智能家居物联网服务平台设计-论文
- 百度 WebUploader 分片上传