web容器的会话机制

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 基本所有web应用开发的朋友都很熟悉session会话这个概念,在某个特定时间内,我们说可以在一个会话中存储某些状态,需要的时候又可以把状态取出来,这整个过程的时间空间可以抽象成“会话”这个概念。

基本所有web应用开发的朋友都很熟悉session会话这个概念,在某个特定时间内,我们说可以在一个会话中存储某些状态,需要的时候又可以把状态取出来,这整个过程的时间空间可以抽象成“会话”这个概念。尽管你对session的使用已经很熟悉了,但你未必真正理解session是什么。因为你只是使用了request.getsession().setAttribute("users", username)把某个值设置到会话中的users变量里面,只是使用了String username = (String)request.getsession().getAttribute("users")获取会话中users变量的值,对于里面具体做了哪些操作、实现机制是如何的可能比较模糊。而这小节将对符合Java规范的web容器的会话机制做一个简单大概的描述。

 

关于web容器的会话运行机制可以根据上图帮助理解,某个客户端向WebContainer发起请求,http请求报文的cookie头部携带了会话标识jsessionid(假设使用tomcat,会话标识取为jsessionid,其他服务器可能参数名称不叫jsessionid),在我们的WebContainer中,假如已经写好了一个servlet专门用于处理此请求 ,如果要设置某个值到会话中则使用request.getsession().setAttribute(“key”,val),执行此语句具体做了哪些操作呢?首先getsession方法其实就是根据jsessionidweb容器的会话集中查找属于此客户端的会话对象,数据结构如上图的下半部分所示,例如客户端传的值为jsessionid1,则找到对应的会话session1。其次是调用获取到的会话sessionsetAttribute方法,它其实是往会话中保存数据,session1包含了一个kv结构用于存放数据,所以其实就是把键值放到kv结构中。那么如果要获取会话的值则使用request.getsession().getAttribute(“key”),如果已经搞懂了会话的设置则很好理解,先根据jsessionid获取session对象,再根据key获取session对象里面的kv集对应的值。

另外,客户端是如何把jsessionid传递到服务端的呢?一般会有三种方式,①cookie方式,即通过浏览器读取小文本cookie,读取jsessionid值后附加到http协议的cookie头部,http协议报文传输到服务端后解析cookie头部便可以获取,但如果你把浏览器的cookie给禁止了则这种方式会失效。②重写url方式,即把jsessionid附加到请求的url中,例如http://www.tomcat.com/index.jsp?jsessionid=326257DA6DB76F8D2E38F2C4540D1DEA。③表单隐藏方式,这种方式其实类似重写url方式,我们把jsessionid及其值存放在html表单中,提交时就会一起被提交,服务端只要根据postget方法分别解析便可获取到。

Web容器的会话机制补充了http协议的无状态性,使web在应用功能方面更加强大,满足了更多更复杂的需求。不管是web应用层开发人员还是中间件开发人员深入理解session机制在软件设计时都会有很大的帮助。

 

点击订购作者《Tomcat内核设计剖析》



目录
相关文章
|
7月前
|
缓存 应用服务中间件 nginx
Web服务器的缓存机制与内容分发网络(CDN)
【8月更文第28天】随着互联网应用的发展,用户对网站响应速度的要求越来越高。为了提升用户体验,Web服务器通常会采用多种技术手段来优化页面加载速度,其中最重要的两种技术就是缓存机制和内容分发网络(CDN)。本文将深入探讨这两种技术的工作原理及其实现方法,并通过具体的代码示例加以说明。
712 1
|
4月前
|
开发者 Docker Python
从零开始:使用Docker容器化你的Python Web应用
从零开始:使用Docker容器化你的Python Web应用
175 4
|
4月前
|
机器学习/深度学习 数据采集 Docker
Docker容器化实战:构建并部署一个简单的Web应用
Docker容器化实战:构建并部署一个简单的Web应用
|
5月前
|
Java 应用服务中间件 Apache
浅谈Tomcat和其他WEB容器的区别
Tomcat是一款轻量级的免费开源Web应用服务器,常用于中小型系统及并发访问量适中的场景,尤其适合开发和调试JSP程序。它不仅能处理HTML页面,还充当Servlet和JSP容器。相比之下,物理服务器是指具备处理器、硬盘等硬件设施的服务器,如云服务器,其设计目标是在处理能力、稳定性和安全性等方面提供高标准服务。简言之,Tomcat专注于运行Java应用,而物理服务器则提供基础计算资源。
|
6月前
|
安全 Go PHP
Web安全-会话ID漏洞
Web安全-会话ID漏洞
60 3
|
5月前
|
JavaScript Linux 开发者
使用Docker容器化Web应用:从零开始
使用Docker容器化Web应用:从零开始
|
7月前
|
Kubernetes 应用服务中间件 nginx
基于容器化的Web服务器管理
【8月更文第28天】随着云原生技术的发展,容器化已经成为部署和管理应用程序的标准方式之一。Docker 和 Kubernetes 等工具提供了强大的容器管理和编排能力,使得开发者能够轻松地部署、扩展和维护 Web 服务器。本文将详细介绍如何使用 Docker 和 Kubernetes 实现 Web 服务器的容器化部署,并提供详细的步骤和代码示例。
321 1
|
7月前
|
存储 安全 搜索推荐
【JavaWeb 秘籍】Cookie vs Session:揭秘 Web 会话管理的奥秘与实战指南!
【8月更文挑战第24天】本文以问答形式深入探讨了Web开发中关键的会话管理技术——Cookie与Session。首先解释了两者的基本概念及工作原理,随后对比分析了它们在存储位置、安全性及容量上的差异。接着,通过示例代码详细介绍了如何在JavaWeb环境中实现Cookie与Session的操作,包括创建与读取过程。最后,针对不同应用场景提供了选择使用Cookie或Session的指导建议,并提出了保障二者安全性的措施。阅读本文可帮助开发者更好地理解并应用这两种技术。
112 1
|
7月前
|
C# 开发者 Windows
WPF遇上Office:一场关于Word与Excel自动化操作的技术盛宴,从环境搭建到代码实战,看WPF如何玩转文档处理的那些事儿
【8月更文挑战第31天】Windows Presentation Foundation (WPF) 是 .NET Framework 的重要组件,以其强大的图形界面和灵活的数据绑定功能著称。本文通过具体示例代码,介绍如何在 WPF 应用中实现 Word 和 Excel 文档的自动化操作,包括文档的读取、编辑和保存等。首先创建 WPF 项目并设计用户界面,然后在 `MainWindow.xaml.cs` 中编写逻辑代码,利用 `Microsoft.Office.Interop` 命名空间实现 Office 文档的自动化处理。文章还提供了注意事项,帮助开发者避免常见问题。
520 0
|
7月前
|
开发者 容器 Docker
JSF与Docker,引领容器化浪潮!让你的Web应用如虎添翼,轻松应对高并发!
【8月更文挑战第31天】在现代Web应用开发中,JSF框架因其实用性和灵活性被广泛应用。随着云计算及微服务架构的兴起,容器化技术变得日益重要,Docker作为该领域的佼佼者,为JSF应用提供了便捷的部署和管理方案。本文通过基础概念讲解及示例代码展示了如何利用Docker容器化JSF应用,帮助开发者实现高效、便携的应用部署。同时也提醒开发者注意JSF与Docker结合使用时可能遇到的限制,并根据实际情况做出合理选择。
76 0