Java-servlet(十)使用过滤器,请求调度程序和Servlet线程(附带图谱表格更好对比理解)
Java-servlet(十)使用过滤器,请求调度程序和Servlet线程
- 前言
- 一、Servlet 间通信(了解即可)
- 二、Servlet 请求处理:getAttribute 和 getParameter 的区别与应用
- 1.getAttribute 方法
- 2.getParameter 方法
- 三、Servlet线程模型
- 多线程模型
- 单线程模型
- 四、servlet过滤器(重点)
- 4.1 过滤器的作用
- 4.2 过滤器的使用场景
- 4.3. 实现过滤器链
- 4.4. 配置文件优先级
前言
- 在前几篇博客中,我们学习了 Servlet 的基础配置、生命周期、请求响应处理以及 Java Servlet 环境的配置
- 接下来,我们将深入探讨 Servlet 间通信、Servlet 响应的相关方法、Servlet 线程模型以及 Servlet 过滤器等重要内容。
我的个人主页,欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的Java-servlet文章专栏
欢迎来阅读指出不足
https://blog.csdn.net/2402_83322742/category_12907265.html?spm=1001.2014.3001.5482
一、Servlet 间通信(了解即可)
- Servlet 间通信可以通过请求分配器对象来实现,它实际上是一种转发机制。
- 比如在一个 Web 应用中,当用户请求一个 Servlet 时,该 Servlet 可能需要将请求转发给另一个 Servlet 进行进一步处理。这在多个 Servlet 协同完成一个复杂功能时非常有用。
- 例如,一个 Servlet 负责接收用户的登录请求,验证用户名和密码后,将请求转发给另一个 Servlet 来处理登录成功后的页面跳转或权限分配等操作。
二、Servlet 请求处理:getAttribute 和 getParameter 的区别与应用
- 在处理 HTTP 请求时,Servlet 提供了多种方法来获取请求数据和设置响应内容。
- 其中,
getAttribute 和 getParameter是两个常用的方法,它们的作用和使用方式有所不同。
一句话记忆:
getAttribute:拿自己人(服务器)的数据。getParameter:拿外人(用户)的数据。
@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.getWriter().write("doPost"+req.getParameter("name"));String username=(String) req.getAttribute("name");String username1= req.getParameter("name");resp.getWriter().write("getAttribute"+username+"---getParameter"+username1);}
- 例如上面代码中的
String username=(String) req.getAttribute("name");
String username1= req.getParameter("name");
1.getAttribute 方法
getAttribute 方法用于从请求中获取属性值。
这些属性可以是其他 Servlet 或过滤器设置的,也可以是我们在当前 Servlet 中设置的。例如:
request.setAttribute("username", "张三");
String username = (String) request.getAttribute("username");
- 在这个例子中,我们首先通过 setAttribute 方法将一个属性 username 设置到请求中,然后通过 getAttribute 方法获取这个属性的值。
2.getParameter 方法
getParameter 方法用于从请求中获取用户提交的表单参数。例如,用户在登录表单中输入了用户名和密码,我们可以通过 getParameter 方法获取这些参数
String username = request.getParameter("username");
String password = request.getParameter("password");
这两个方法的区别在于: getAttribute 获取的是请求中的属性,而 getParameter 获取的是用户提交的表单参数。在实际开发中,我们需要根据具体需求选择合适的方法
| 对比项 | getAttribute | getParameter |
|---|---|---|
| 作用 | 从请求中获取属性值(可用于Servlet间传递数据) | 从请求中获取用户提交的表单参数(如URL参数或表单输入) |
| 数据来源 | 服务器端通过setAttribute设置的数据 | 客户端(浏览器)发送的请求参数(如HTML表单、URL查询字符串) |
| 数据类型 | 可以是任意Java对象(需强制类型转换) | 始终是字符串类型(即使表单中输入的是数字) |
| 使用场景 | 在多个Servlet/JSP之间共享数据(如登录后的用户信息) | 处理用户输入(如登录验证、表单提交) |
| 示例代码 | request.setAttribute("user", userObject);User user = (User) request.getAttribute("user"); | String username = request.getParameter("username");int age = Integer.parseInt(request.getParameter("age")); |
| 注意事项 | 需手动进行类型转换 | 若参数不存在则返回null,需处理空值情况 |
简单总结:
getAttribute:用于服务器内部数据传递(如A Servlet处理完数据后传递给B Servlet)。getParameter:用于获取用户输入数据(如表单提交的用户名、密码)。
一句话记忆:
getAttribute:拿自己人(服务器)的数据。getParameter:拿外人(用户)的数据。
三、Servlet线程模型
- 在 Java Web 应用中,Servlet 的线程模型是一个非常重要的概念。
- 它决定了 Servlet 如何处理并发请求,以及如何管理线程资源。
- 常见的线程模型有两种:多线程模型和单线程模型
多线程模型
- 多线程模型是 Servlet 的默认线程模型。
- 在这种模型下,每个请求都会被分配到一个独立的线程中处理。
- 这种方式的优点是可以同时处理多个请求,提高应用的响应速度。
- 然而,多线程模型也存在一些缺点,比如线程安全问题。
- 由于多个线程可能会同时访问共享资源,如果没有进行适当的同步处理,可能会导致数据不一致等问题。
单线程模型
- 单线程模型通过实现 SingleThreadModel 接口来实现。
- 在这种模型下,Servlet 的每个实例只会被一个线程访问,从而避免了线程安全问题。然
- 而,单线程模型也有其缺点,比如性能较低。由于每次只能处理一个请求,当请求量较大时,可能会导致应用响应缓慢
以下是 Servlet 线程模型的对比表格:
| 对比项 | 多线程模型 | 单线程模型 |
|---|---|---|
| 线程处理方式 | 每个请求分配独立线程,并发处理多个请求 | 同一时间仅一个线程处理请求(排队执行) |
| 默认情况 | 是(Servlet 的默认行为) | 否(需手动实现 SingleThreadModel 接口) |
| 优点 | 响应速度快,支持高并发 | 无需处理线程安全问题 |
| 缺点 | 需自行处理线程安全(如同步代码块) | 性能低,请求量大时易阻塞 |
| 适用场景 | 高并发 Web 应用(如电商网站、社交平台) | 线程安全敏感但并发量低的场景(如简单管理后台) |
| 注意事项 | 共享资源(如成员变量)需同步控制 | Servlet 2.4 后 SingleThreadModel 已废弃,推荐使用其他线程安全方案(如局部变量) |
一句话总结:
- 多线程模型:快但需小心线程安全。
- 单线程模型:安全但性能差,已过时。
四、servlet过滤器(重点)
- 过滤器是 Java-servlet 中的一个重要特性,它可以对请求和响应进行拦截和处理。
- 过滤器的作用非常广泛,比如可以用于日志记录、权限校验、请求编码设置等。
4.1 过滤器的作用
- 过滤器的主要作用是对请求和响应进行预处理和后处理。
- 例如,在请求到达 Servlet 之前,过滤器可以对请求进行校验,如果用户没有登录,可以直接返回错误信息,而不需要让请求到达 Servlet。
- 在响应返回给客户端之前,过滤器也可以对响应内容进行处理,比如添加一些额外的信息。
4.2 过滤器的使用场景
过滤器的使用场景非常多,以下是一些常见的场景:
- 日志记录:记录请求的详细信息,方便后续的分析和排查问题。
- 权限校验:检查用户是否具有访问某个资源的权限。
- 请求编码设置:设置请求的编码格式,避免出现乱码问题。
- 响应压缩:对响应内容进行压缩,减少传输数据量。
4.3. 实现过滤器链
过滤器链是指多个过滤器按照一定的顺序依次对请求和响应进行处理。在 Java-servlet 中,可以通过实现 Filter 接口并注册多个过滤器来实现过滤器链。以下是一个简单的例子:
// FilterDemo1
public class FilterDemo1 implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {// 初始化过滤器}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("执行了过滤器-FilterDemo1");chain.doFilter(request, response); // 将请求传递给下一个过滤器或 Servlet}@Overridepublic void destroy() {// 销毁过滤器}
}
在 doFilter 方法中, chain.doFilter(request, response) 语句用于将请求传递给下一个过滤器或 Servlet。通过这种方式,多个过滤器可以依次对请求和响应进行处理。
4.4. 配置文件优先级
在 Java-servlet 中,过滤器的配置可以通过 web.xml 文件或注解来完成。如果同时使用了 web.xml 文件和注解,配置文件的优先级会高于注解。以下是一个 web.xml 文件的配置示例:
<filter><filter-name>filter2</filter-name><filter-class>filter.FilterDemo2</filter-class>
</filter>
<filter-mapping><filter-name>filter2</filter-name><url-pattern>/index</url-pattern>
</filter-mapping><filter><filter-name>filter1</filter-name><filter-class>filter.FilterDemo1</filter-class>
</filter>
<filter-mapping><filter-name>filter1</filter-name><url-pattern>/index</url-pattern>
</filter-mapping><filter><filter-name>filter3</filter-name><filter-class>filter.FilterDemo3</filter-class>
</filter>
<filter-mapping><filter-name>filter3</filter-name><url-pattern>/index</url-pattern>
</filter-mapping>
- 在上面的配置中, filter1 、 filter2 和 filter3 是三个过滤器,它们都会对 /index 路径的请求进行处理。过滤器的执行顺序由 filter-mapping 的配置顺序决定。
核心概念速记
- Servlet 间通信要点:
- 借助请求分配器对象实现转发机制。
- 适用于多个 Servlet 协同完成复杂功能场景,如登录验证与后续处理的转发。
- 请求处理方法区别:
- getAttribute:获取服务器内部设置的属性值,数据类型为任意 Java 对象(需强制类型转换),用于 Servlet 间数据共享。
- getParameter:获取用户提交的表单参数,数据类型为字符串,用于处理用户输入。
- 线程模型特性:
- 多线程模型:默认模型,每个请求分配独立线程,能并发处理请求但需处理线程安全问题,适用于高并发场景。
- 单线程模型:实现
SingleThreadModel接口(已废弃),同一时间仅一个线程处理请求,无线程安全问题但性能低,适用于并发量低且线程安全敏感场景。
- 过滤器关键应用:
- 对请求和响应进行拦截和处理,可用于日志记录、权限校验、请求编码设置、响应压缩等。
- 实现过滤器链,多个过滤器按顺序处理请求和响应,配置文件(
web.xml)优先级高于注解,过滤器执行顺序由filter-mapping配置顺序决定。
Java-servlet 相关对比
| 对比项 | getAttribute | getParameter | 多线程模型 | 单线程模型 |
|---|---|---|---|---|
| 数据来源 | 服务器端设置的数据 | 客户端发送的请求参数 | 每个请求分配独立线程 | 同一时间仅一个线程处理请求 |
| 数据类型 | 任意 Java 对象(需强制类型转换) | 字符串 | 支持高并发 | 性能低,请求量大时易阻塞 |
| 使用场景 | Servlet 间共享数据 | 处理用户输入 | 高并发 Web 应用 | 线程安全敏感但并发量低的场景 |
| 注意事项 | 需手动进行类型转换 | 若参数不存在则返回 null,需处理空值情况 | 共享资源需同步控制 | Servlet 2.4 后已废弃,推荐其他线程安全方案 |
知识图谱
Java-servlet(十) 使用过滤器,请求调度程序和 Servlet 线程
├─ Servlet 间通信
│ └─ 请求分配器对象实现转发
├─ 请求处理方法
│ ├─ getAttribute(拿服务器数据)
│ └─ getParameter(拿用户数据)
├─ 线程模型
│ ├─ 多线程模型(默认,快但需线程安全处理)
│ └─ 单线程模型(已废弃,安全但性能差)
├─ 过滤器
│ ├─ 作用(请求响应拦截处理)
│ ├─ 使用场景(日志、权限、编码、压缩)
│ ├─ 实现过滤器链(多个过滤器按序处理)
│ └─ 配置文件优先级(`web.xml` 高于注解)
└─ 关键术语 ├─ 请求分配器、`getAttribute`、`getParameter` ├─ 多线程模型、`SingleThreadModel` └─ 过滤器、`Filter`、`filter-mapping`
重点提炼
-
Servlet 间通信:
- 理解请求分配器的转发机制,用于 Servlet 间协同工作。
- 实际应用中合理利用转发,优化业务逻辑处理流程。
-
请求处理方法:
- 明确
getAttribute和getParameter的区别,根据需求正确选择使用。 - 注意
getAttribute的类型转换和getParameter的空值处理。
- 明确
-
线程模型:
- 掌握多线程模型的并发处理优势和线程安全问题。
- 了解单线程模型的原理及废弃原因,避免错误使用。
-
过滤器应用:
- 熟悉过滤器的多种使用场景,在项目中合理应用以提升系统功能。
- 掌握过滤器链的实现和配置文件优先级,正确配置过滤器顺序。
-
技术实践要点:
- 在处理并发请求时,对共享资源进行同步控制,确保数据一致性。
- 配置过滤器时,根据实际需求和优先级选择合适的配置方式。
以上就是这篇博客的全部内容,下一篇我们将继续探索 Java-servlet 的更多精彩内容。
我的个人主页,欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的Java-servlet文章专栏
欢迎来阅读指出不足
https://blog.csdn.net/2402_83322742/category_12907265.html?spm=1001.2014.3001.5482
| 非常感谢您的阅读,喜欢的话记得三连哦 |

相关文章:
Java-servlet(十)使用过滤器,请求调度程序和Servlet线程(附带图谱表格更好对比理解)
Java-servlet(十)使用过滤器,请求调度程序和Servlet线程 前言一、Servlet 间通信(了解即可)二、Servlet 请求处理:getAttribute 和 getParameter 的区别与应用1.getAttribute 方法2.getParameter 方法 三、…...
ue5 学习笔记 FPS游戏制作35 GameMode与GameInstance
文章目录 相似GameMode介绍声明设置生效调用 GameInstance介绍声明设置生效调用 相似 两者都用来保存公共的数据和方法 数据都在内存里,关闭程序后数据消失 GameMode 介绍 生命周期跟随关卡,关卡销毁GameMode也跟随销毁 内部可以定义属性和方法 声明…...
rocky9.4 升级SSH 9.9p2
echo "##################################开始升级Openssh##################################################################################" ##ssh变量---------------------------------------- sshnumber9.9p2 sshnumber1ssh -V 2>&1 | cut -d, -f…...
基于WebSocket的金融数据实时推送系统架构设计对接多国金融数据API
基于WebSocket的金融数据实时推送系统架构设计 ——高可用、低延迟与全球化数据支持的技术实践 一、实时数据推送的技术演进 在证券交易、外汇监控、量化策略等场景中,毫秒级延迟可能带来完全不同的业务结果。早期基于HTTP轮询的方案存在三大核心问题:…...
山洪预警秒级响应-AI本地化部署在极端降雨短临预测中的技术突破。AI智能体开发与大语言模型的本地化部署、优化技术
极端降雨预测的技术痛点与边缘破局 1. 传统预警系统的三重瓶颈 延迟致命:WRF模式在1km分辨率下3小时预报耗时>45分钟,错过山洪黄金响应期 地形干扰大:复杂地形区(如横断山脉)降水预测误差超50% 数…...
矿山自动化监测解决方案
1.行业现状 为贯彻落实《中共中央国务院关于推进安全生产领域改革发展的意见》《“十四五”矿山安全生产规划》(应急〔2022〕64号)、《国务院安委会办公室关于加强矿山安全生产工作的紧急通知》(安委办〔2021〕3号)等有关工作部署…...
pytorch学习(b站小土堆学习)
1 环境配置 参考链接 2. dir 和 help函数 dir():用于查看某一模块函数的方法 help(): 用于查看某方法的使用方法 3. dataset类实战 利用Image对象打开图片,利用os模块的地址拼接组成图片路径 当我们用方括号访问元素对象时,…...
微信小程序:解决tabbar切换时,页面不刷新问题
在微信小程序中,默认情况下切换 tabBar 页面时,页面不会重新加载或刷新(而是保持之前的状态)。如果你需要在切换 tabBar 时触发数据刷新或重新执行某些逻辑,可以通过以下方法解决: 方法 1:…...
【最新】探索CFD的未来:从OpenFOAM到深度学习,全面解析计算流体力学的顶级资源与前沿技术
计算流体力学(CFD)作为现代工程与科学研究的核心工具,正以前所未有的速度迈向智能化与多物理场耦合的新时代。本文全面梳理了在线学习CFD的顶级资源,涵盖了从传统数值模拟到深度学习驱动的物理信息模型的广泛领域,旨在为研究者、工程师和学生提供一站式参考指南。内容分为…...
算法专题一:双指针算法(下)
书接上回 5.有效三角形个数 力扣: 有效三角形的个数 在做这道题前我们先讲一个数学知识:已知 a < b < c ,此时 ab>c 可以得出 有效三角形。 所以,我们做这道题时,可以不使用暴力算法。 可以优化为先排序ÿ…...
数据库部署在服务器表不存在解决方案
MySQL 数据库表不存在错误解决方案 MySqlException (0x80004005): Table store.SysLogOperate doesnt exist 服务器用的mysql5.6 用这个表syslogoperate只是全是小写 看起来你在使用 Pomelo.EntityFrameworkCore.MySql 作为 MySQL 数据库的提供程序,并且在初始化…...
咪咕MG101_晨星MSO9380芯片_安卓5.1.1_免拆卡刷固件包
咪咕MG101_晨星MSO9380芯片_安卓5.1.1_免拆卡刷固件包(内有教程) 刷机教程简单说明: 1、把下载好的刷机包,U盘里建立一个upgrade文件夹,固件放入此文件夹里,放入U盘中,注意升级包为压缩包不要对…...
cJSON类型及type值详解
cJSON的核心结构体 cJSON的核心结构体就是一个cJSON,理解了这个结构体,基本上对cJSON的使用就有了个基本概念了。该结构体具体定义如下: typedef struct cJSON { struct cJSON*next,*prev; /* 遍历数组或对象链的前向或后向链表指…...
T11 TensorFlow入门实战——优化器对比实验
🍨 本文為🔗365天深度學習訓練營 中的學習紀錄博客🍖 原作者:K同学啊 | 接輔導、項目定制 一、前期准备 1. 导入数据 # Import the required libraries import pathlib import matplotlib.pyplot as plt import tensorflow as t…...
2023年3月全国计算机等级考试真题(二级C语言)
😀 第1题 下列叙述中错误的是 A. 向量是线性结构 B. 非空线性结构中只有一个结点没有前件 C. 非空线性结构中只有一个结点没有后件 D. 只有一个根结点和一个叶子结点的结构必定是线性结构 概念澄清 首先,我们需要明确几个关键概念…...
在MFC中使用Qt(四):使用属性表(Property Sheet)实现自动化Qt编译流程
前言 首先回顾下前面文章介绍的: 在MFC中使用Qt(一):玩腻了MFC,试试在MFC中使用Qt!(手动配置编译Qt) 在MFC中使用Qt(二):实现Qt文件的自动编译流…...
Python-八股总结
目录 1 python 垃圾处理机制2 yield3 python 多继承,两个父类有同名方法怎么办?4 python 多线程/多进程/协程4.1 多线程与GIL全局解释器锁4.2 多进程4.3 协程 5 乐观锁/悲观锁6 基本数据结构**1. 列表(List)****2. 元组࿰…...
局域网数据同步软件,局域网数据备份的方法
局域网数据备份的方法: 局域网数据备份是确保数据安全性的重要措施,以下是一些常用的局域网数据备份方法: 1.使用NAS设备备份 特点:网络附加存储(NAS)设备提供了一种便捷的备份方式。 操作:…...
ngx_http_core_init_main_conf
定义在 src\http\ngx_http_core_module.c static char * ngx_http_core_init_main_conf(ngx_conf_t *cf, void *conf) {ngx_http_core_main_conf_t *cmcf conf;ngx_conf_init_uint_value(cmcf->server_names_hash_max_size, 512);ngx_conf_init_uint_value(cmcf->serv…...
座舱与智驾“双轮驱动”,芯擎科技打造智能汽车“芯”标杆
在比亚迪、吉利、奇瑞等各大主机厂打响“全民智驾”的关键时期,以芯擎科技为代表中国芯片厂商开始“放大招”。 2025年3月27日,芯擎科技在南京举办了“擎随芯动、智融万象”生态科技日,重磅发布了“星辰一号”、“星辰一号Lite”,…...
《新能源汽车 DEEA 平台开发策略》
一、引言 在新能源汽车行业加速向智能化、电动化转型的当下,电子电气架构(EEA)成为汽车技术创新的关键领域。DEEA 平台作为应对行业变革的重要举措,其开发策略对于提升汽车产品竞争力、满足市场多样化需求意义重大。本策略围绕平台…...
R语言实现轨迹分析--traj和lcmm包体会
R语言实现轨迹分析–traj和lcmm包体会 轨迹分析是对重复测量数据的一种归纳,转化为一种分类变量,比如手术后1~7天内的疼痛评分,可以形成术后急性痛轨迹。形成的轨迹作为一个分类变量,可以用于预测疾病的预后ÿ…...
Spring Boot中对同一接口定义多个切面的示例,分别通过接口方式和注解方式实现切面排序,并对比差异
以下是Spring Boot中对同一接口定义多个切面的示例,分别通过接口方式和注解方式实现切面排序,并对比差异: 一、接口方式实现切面排序 1. 定义接口 // 服务接口 public interface MyService {void methodA();void methodB(); }// 接口实现类…...
从零开始:Windows 系统中 PowerShell 配置 FFmpeg 的详细步骤
在Windows系统中不想每次都 cd 到FFmpeg目录中应用,现在可以通过PowerShell在任意目录下应用了。 PowerShell 基础概念 跨平台脚本工具 PowerShell 是微软开发的命令行外壳和脚本语言,支持 Windows、Linux 和 macOS 系统。其核心优势在于面向对象的操作…...
《新凯来 :中国半导体设备制造行业从“跟随者”向“挑战者”的角色转变》
《新凯来 :中国半导体设备制造行业从“跟随者”向“挑战者”的角色转变》 一、技术突破再升级二、生态布局加速三、市场与资本动态四、未来挑战与应对五、行业意义 新凯来作为国产半导体设备领域的领军企业,其技术突破与市场进展持续引发行业关注。结合最…...
Java-拼图小游戏跟学笔记
阶段项目-01-项目介绍和界面搭建_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV17F411T7Ao?p144 代码 1.主界面分析(组件) JFrame:最外层的窗体 JMenuBar:最上层的菜单 JLabel:管理文字和图片的容器 1.界面 --关闭模式-- DO_NOTHING_ON_CLOSE:当用户…...
phpStorm2021.3.3在windows系统上配置Xdebug调试
开始 首先根据PHP的版本下载并安装对应的Xdebug扩展在phpStorm工具中找到设置添加服务添加php web page配置完信息后 首先根据PHP的版本下载并安装对应的Xdebug扩展 我使用的是phpStudy工具,直接在php对应的版本中开启xdebug扩展, 并在php.ini中添加如下…...
FALL靶机
下载靶机,可以看到靶机地址 在kali上扫描靶机的端口和目录文件 访问:http://192.168.247.146/test.php,他提示我们参数缺失 我们爆破一下他的参数 使用kali自带的fuzz FUZZ就是插入参数的位置 -w 指定字典文件 wfuzz -u "http://192.…...
QT文件操作(QT实操学习3)
1.项目架构 1.UI界面 1.新建文本文档 2.打开文件 3.另存为文件 2.mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QFileDialog> #include <QMessageBox> #include <QDebug> QT_BEGIN_NAMESPACE namespa…...
主流云平台(AWS、华为云、阿里云、Google Cloud等)的**大数据及人工智能技术栈**及其核心组件的深度解析
云计算系列文章: 1. GCP(Cloud-native stack)的云原生技术栈介绍 2. 主流云厂商的云原生技术栈(Cloud-native stack)及其核心组件对比 3. 主流云平台(AWS、华为云、阿里云、Google Cloud等)的…...
