web容器的会话机制

基本所有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方法其实就是根据jsessionid从web容器的会话集中查找属于此客户端的会话对象,数据结构如上图的下半部分所示,例如客户端传的值为jsessionid1,则找到对应的会话session1。其次是调用获取到的会话session的setAttribute方法,它其实是往会话中保存数据,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表单中,提交时就会一起被提交,服务端只要根据post或get方法分别解析便可获取到。

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

 

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

时间: 2024-09-20 03:09:11

web容器的会话机制的相关文章

主流web容器(jetty,tomcat,jboss)的classloader机制对比和相关问题分析

背景      前段时间一直在做应用容器的迁移,将公司的应用容器从jboss,tomcat统一迁移到jetty.在整个迁移过程中遇到最多的潜在问题还是在classloader机制上,这里记录一下希望能对大家有所帮助,避免重复走弯路.   啥都不说,先来看下遇到的几个问题,比较纠结的问题. 问题1: (jar sealed问题) 1.Caused by: java.lang.SecurityException: sealing violation: package com.sun.media.ja

如何设计一个web容器

开发一个web容器涉及很多不同方面不同层面的技术,例如通信层的知识,程序语言层面的知识等等,且一个可用的web容器是一个比较庞大的系统,要说清楚需要很长的篇幅,本文旨在介绍如何设计一个web容器,只探讨实现的思路,并不涉及过多的具体实现.把它分解划分成若干模块和组件,每个组件模块负责不同的功能,下图列出一些基本的组件,并将对每个组件进行介绍.   连接接收器 主要的职责就是监听是否有客户端套接字连接并接收socket,再将socket交由任务执行器(线程池)执行.不断从系统底层读取socket,

如何设计一个可用的web容器

之前在另外一个平台(http://www.jointforce.com/jfperiodical/article/1035)发表的一篇文章,现在发布到自己的博客上.     开发一个web容器涉及很多不同方面不同层面的技术,例如通信层的知识,程序语言层面的知识等等,且一个可用的web容器是一个比较庞大的系统,要说清楚需要很长的篇幅,本文旨在介绍如何设计一个web容器,只探讨实现的思路,并不涉及过多的具体实现.把它分解划分成若干模块和组件,每个组件模块负责不同的功能,下图列出一些基本的组件,并将对

【整理】WEB 容器、WEB服务和应用服务器的区别与联系

对于一个不了解 WEB 开发的人来说,下面的概念是为了免于被别人鄙视和忽悠的~~  [web 容器]  何为容器:       容器是一种服务调用规范框架,J2EE 大量运用了容器和组件技术来构建分层的企业级应用.在 J2EE 规范中,相应的有 WEB Container 和 EJB Container 等.        WEB 容器给处于其中的应用程序组件(JSP,SERVLET)提供一个环境,使 JSP,SERVLET 直接跟容器中的环境变量交互,不必关注其它系统问题(从这个角度来说,we

javaee-tomcat等这种web容器如何知道jsp发生了变化要去重新编译?

问题描述 tomcat等这种web容器如何知道jsp发生了变化要去重新编译? 第一个问题:jsp第一次访问过以后,会编译成.class.如果不作任何修改,之后重启tomcat,那么再次访问这个jsp还要编译吗?(不要喷我没做实验啊,我试验在windows下.class的时间(访问.修改.创建)没有变化,linux下(access.modified.change)中access时间变了.查了一下好像modified时间是修改时间,它没变应该表示没有重新编译,但是access时间为什么有变化而win

Java Web的安全验证机制的例子

security-constraint 部署描述符中的security-constraint元素允许不通过编程就可以限制对某个资源的访问. <!ELEMENT security-constraint (display-name?,web-resource-collection+,auth-constraint?, user-data-constraint?)> <!ELEMENT display-name (#PCDATA)> <!ELEMENT web-resource-c

Spring源代码解析(二):IOC容器在web容器中的启动

以下引用自博客:http://jiwenke-spring.blogspot.com/ 上面我们分析了IOC容器本身的实现,下面我们看看在典型的web环境中,Spring IOC 容器是怎样被载入和起作用的. 简单的说,在web容器中,通过ServletContext为Spring的IOC容器提供宿主环境,对 应的建立起一个IOC容器的体系.其中,首先需要建立的是根上下文,这个上下文持有的 对象可以有业务对象,数据存取对象,资源,事物管理器等各种中间层对象.在这个上下 文的基础上,和web MV

web容器多线程对代码的影响

问题描述 web容器多线程对代码的影响 并发访问web服务器,web服务器会创建多个线程调用代码A.如果代码A中没有任何线程控制关键词(volatile,synchronized等). 问题1:代码A的执行是安全的吗,怎么执行的按顺序吗? 问题2:web容器创建多个线程时,每个线程都会有独立的代码A副本吗,创建独立的实例,工作区间吗? 问题3:这部分是否与其他框架有关?,例如依赖注入/控制反转容器 对这部分我理解不清,有理解错的地方帮忙指正下,先谢过 解决方案 不是线程安全的,你必须自己同步共享

WEB容器调用spark程序分析数据

问题描述 WEB容器调用spark程序分析数据 请教各位大神,如何在web容器中(如tomcat)来调用spark程序啊,网上看到的都是自己把程序生成jar包,然后调用spark-submit来执行!! 解决方案 楼主的问题是怎么解决的,我们现在也要这么做,能不能给点指导,小弟在这先谢谢了 解决方案二: 可以参考 一下 这个 http://www.aboutyun.com/thread-11014-1-1.html