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机制在软件设计时都会有很大的帮助。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-20 17:46:18

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

Java Web(三) 会话机制,Cookie和Session详解

一.会话机制 Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份. 由于HTTP协议是无状态的,而出于种种考虑也不希望使之成为有状态的,因此,后面两种方案就成为现实的选择.具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案.同时我们也看到,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所

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

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

HTML5项目笔记7:使用HTML5 WebStorage API构建与.NET对应的会话机制

HTML5的Web Storage API,我们也称为DOMStarage API,用于在Web请求之间持久化数据.在Web Starage API 出现之前,我们都是将客户端和服务端之间的交互数据存储在远程服务器上,随着Web Starage API的出现,我们可以在客户端存储我们重复访问的交互数据,用户在打开浏览器的时候,可以快速地读取到数据,减少了用户等待,数据流量. 在Web Starage 出现之前,我们在客户端存储数据一般使用Cookie,用于客户端和服务端之间保存会话标识符,同时可

web容器 - Jetty

详解web容器 - Jetty与Tomcat孰强孰弱 Jetty 基本架构 Jetty目前的是一个比较被看好的 Servlet 引擎,它的架构比较简单,也是一个可扩展性和非常灵活的应用服务器. 它有一个基本数据模型,这个数据模型就是 Handler(处理器),所有可以被扩展的组件都可以作为一个 Handler,添加到 Server 中,Jetty 就是帮你管理这些 Handler. 下图是 Jetty 的基本架构图,整个 Jetty 的核心组件由 Server 和 Connector 两个组件构

常用java web容器http长连接超时设置

1.http长连接相关知识 http长连接对我们来说并不陌生,但长连接并不是永远不会关闭.对于HTTP长连接需要注意下面几点: keepalive_timeout指的是web服务器发送完最后一个响应报文后,开始计时,如果在keepalive_timeout指定的时间内还没有收到该连接上的下次请求,则关闭该连接. http长连接的keepalive_time和tcp连接的keepalive_timeout不同. http keep-alive与tcp keep-alive,意图不一样.http k

Node.js 没有Web容器

Node.js 特点 1.单线程 在Java.PHP或者.net等服务器端语言中,会为每一个客户端连接创建一个新的线程.而每个线程需要耗费大约2MB内存.也就是说,理论上,一个8GB内存的服务器可以同时连接的最大用户数为4000个左右.要让Web应用程序支持更多的用户,就需要增加服务器的数量,而Web应用程序的硬件成本当然就上升了. Node.js不为每个客户连接创建一个新的线程,而仅仅使用一个线程.当有用户连接了,就触发一个内部事件,通过非阻塞I/O.事件驱动机制,让Node.js程序宏观上也

nginx代理,wildfly做web容器实现网站输入域名跳转到https的域名

应公司要求想要实现用户输入域名访问网站,自动跳转到https加域名的网页,因为添加了ssl,能显示公司的名称.我的操作方法是把ssl放到web容器中,前面加一个nginx做代理,将所有到80端口的请求,转到web容器的443的端口上. 配置web容器的方法在之前写过,参考<wildfly用https的方式访问>,链接:http://881955.blog.51cto.com/871955/1670069 安装wildfly的方式 yum install java-1.8.0-openjdk-d

深度实现session【包括session入库、session机制和session和cookie的使用方法,完善会话机制(在分布式机器中也能使用)】、无限分类的实现

1.session的注意点:@session_start();//这个配置需要注意,session开启中会有影响,所以使用错误抑制符进行限制[并且使用php.ini对session进行自动开启] session_start()前的输出问题:[session信息本身会增加到http头信息,也就是http主体不能在头前]对php.ini中的输出缓存进行配置,out_buffer的配置[注意:开启之后能够保证输出内容在脚本中缓存] [注意](1)脚本中session变量的键只能是字符串类型的[$_SE

web容器 web服务器 应用服务器

1.Web Server,Web container和Application Server区别. Web Server,Web服务器,同上面所说,Web服务器是指能够为发出请求的浏览器提供文档的程序.服务器是一种被动程序,只有浏览器发出请求的时候才会响应.应用层使用的是HTTP协议.目前最主流的三个Web服务器是Apache Nginx IIS. Web容器是一种服务器程序,在服务器端口就有一个提供相应服务的程序.所以现在知道为什么Tomcat有默认的端口——8080.一个服务器可以有多个容器.