1.什么是会话(Session)

超文本传输协议(HTTP)被设计成一种无状态的协议。

所谓无状态协议就是指在服务器端的请求彼此相互之间是不认识彼此的,哪怕是来自同一个客户端的请求,相互之间也是不认识的,这个就叫做无状态

但要构建复杂的Web应用程序,就必须能够将来自同一个客户端的请求彼此关联起来。比如我们最常见的信息管理系统,一般要求用户先登录,后进行相关操作,而仅仅通过无状态协议实现这个功能是非常麻烦,而且不安全的。

由于请求彼此之间相互不认识,因此尝试修改用户信息的请求无法依赖于登录认证的请求所提供的身份认证信息,而只能每次在请求时自己携带登录信息,这样会造成额外的数据负担,并且非常不安全。

因此,需要有一种机制,能够让来自同一个客户端的请求彼此之间能够认识,这种机制被称为会话。

2.会话的实现
会话的实现分为两个部分,首先是要让来自同一个客户端的请求能够彼此相互认识;其次是来自同一个客户端的请求能够在服务器端共享数据。为什么这么说?

让每个来自客户端的请求携带一个口令,来自同一个客户端的请求可能能够获取到相同的口令,这样来自同一个客户端的请求就能够彼此认识。之后请求可以利用这个口令在服务器端存储一些数据,其他请求可以利用口令来读写这些数据。这个就是会话实现的一个基本思路。

3.会话追踪机制(Session Tracking Mechanisms)

要给每个请求设置一个Token,来追踪请求属于哪个会话,被称为会话追踪。目前形成了几种不同的会话追踪策略,但是对于应用程序开发者来说,这些策略直接使用起来都比较麻烦。一般是有应用程序服务器所提供的实现。比如遵循Servlet 规范的Tomcat。

3.1.Cookie
通过HTTP Cookie技术进行会话追踪是最常用的会话追踪机制,也是所有的Servlet容器都必须支持的方式。

容器会发送一个cookie到客户端。然后客户端每次发送一个到服务器的请求时,都会带上这个cookie,这样就能够将这些请求关联到一个会话。

3.2.URL重写(URL Rewriting)
URL重写是使用范围最小的一种会话追踪机制。如果一个客户端不接收cookie,服务器可以使用URL重写来进行会话追踪。URL重写将一个会话ID拼接到URL中。

比如:http://www.myhost.com/oolong/index;jessionid=12345

因为URL重写技术会在多处暴露Session ID,因此如果可能的话,就尽量不使用URL重写技术。

3.3.隐藏表单
通过上面的两个例子,应该能够明白了所谓的会话追踪技术,实际上就是实现一种方式,能够确保客户端在请求服务器端时,能够携带一个身份认证的标志。

因此自然而然的隐藏表单也能够实现这种功能,因此也可以算是一种会话追踪方式。思路就是每个页面上存在一个隐藏表单,这个表单中存放着从服务器端获取的SESSION ID,每次提交请求时,将这个表单中的ID也一起发送到服务器。具体实现方式此处不表。

4.会话的创建
当来自一个客户端的请求首次访问一个应用程序时,是没有SESSION ID的,也就是没有Token,此时服务器会为这个请求创建一个SESSION ID,并且在服务器段开辟一块空间作为这个会话所共享的数据存储区域。

然后当这个请求返回时,会将服务器端创建的这个SESSION ID一起带回客户端,之后每次来自这个客户端的请求,都会携带者这个SESSION ID

5.在会话中绑定值
会话最常用的一个功能是用来做用户登录来自同一个客户端的请求使用一个被称为SESSION ID的Token在服务器端存储一些共享数据。同一个客户端的不同请求因为拥有相同的SESSION ID,因此能够共享属于这个客户端的会话空间,也就能够在里面读写数据。这个被称为在会话中绑定值

6.会话超时(Session Timeouts)
由于每个客户端在访问服务器端时都会占用服务器端一定的系统资源,而服务器端的系统资源是有限的,为了提高利用效率,因此服务器端针对每一个会话的共享空间是有一定的时效性的。超过这个时间,服务器端会自动将这个会话在服务器中所占用的系统资源释放掉,换而言之,这个会话中的数据丢失,会话失效了。

这个会话超时时间是可以设置的,相关的有一些机制可以更智能的计算合理的会话时间,就不在此表述了。

参考

[1] JSR-000340 Java Servlet 3.1 Specification

Servlet——理解会话Session的更多相关文章

  1. 理解会话Session

  2. [转载]深入理解HTTP Session

    深入理解HTTP Session   session在web开发中是一个非常重要的概念,这个概念很抽象,很难定义,也是最让人迷惑的一个名词,也是最多被滥用的名字之一,在不同的场合,session一次的 ...

  3. 重温Servlet学习笔记--session对象

    session的类型是属于HttpSession,HttpSession是由javaWeb提供的,用来会话跟踪的类.session是服务器端对象,保存在服务器端. HttpSession是servle ...

  4. 理解HTTP session原理及应用

    转自:http://www.2cto.com/kf/201206/135471.html 一.术语session在我的经验里,session这个词被滥用的程度大概仅次于transaction,更加有趣 ...

  5. [serverlet][转载: 深入理解HTTP Session]

    [serverlet][转载: 深入理解HTTP Session] 标签(空格分隔): 未分类 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任. ...

  6. 深入理解HTTP Session

    深入理解HTTP Session   session在web开发中是一个非常重要的概念,这个概念很抽象,很难定义,也是最让人迷惑的一个名词,也是最多被滥用的名字之一,在不同的场合,session一次的 ...

  7. {转} 深入理解 HTTP Session

    session在web开发中是一个非常重要的概念,这个概念很抽象,很难定义,也是最让人迷惑的一个名词,也是最多被滥用的名字之一,在不同的场合,session一次的含义也很不相同.这里只探讨HTTP S ...

  8. 简单PHP会话(session)说明

    现在程序员愈发的不容易了,想要精通,必然要寻本溯源,这其实与目前泛滥的愈发高级的语言以及众多的框架刚好相反,因为它们在尽可能的掩盖本源使其简单,个人称之为程序员学习悖论. 注:作者接触web开发和ph ...

  9. jfc在jsp页面画图,不将图片存在服务器端,只存入会话session(可用)

    jfc在jsp页面画图,不将图片存在服务器端,只存入会话session.其中主要用到jfc的一个servlet类. <%@ page contentType="text/html;ch ...

随机推荐

  1. 仍然有人在叫喊C语言已经过时了

    现在,仍然有人在叫喊C语言已经过时了.还有什么值得学习的?看看现在使用Python.PHP和其他语言有多简单.谁去学旧的C语言?是真的吗?作者下载了这两种语言的底层源代码.由于空间的限制,它没有分析框 ...

  2. 3 java 笔记

    1 垃圾回收机制能够很好地提高编程效率 2 垃圾回机制保护程序的完成性 3 面向对象的三种基本特征:继承,封装,多态 4 面向对象的方式:OOA(面向对象的分析),OOD(面向对象的设计)和OOP(面 ...

  3. MongoDB学习笔记,基础+增删改查+索引+聚合...

    一 基础了解 对应关系 -> https://docs.mongodb.com/manual/reference/sql-comparison/ database -> database ...

  4. Creating a PXE Configuration File

      The PXE configuration file defines the menu displayed to the pxe client host as it boots up and co ...

  5. CAN学习方法(知乎)

    作者:心机之花链接:https://www.zhihu.com/question/26776219/answer/244433861来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请 ...

  6. 电子工程师需要了解的SMT贴片质量问题汇总(转)

    点胶工艺中常见的缺陷与解决方法 拉丝/拖尾 拉丝/拖尾是点胶中常见的缺陷,产生的原因常见有胶嘴内径太小.点胶压力太高.胶嘴离PCB的间距太大.贴片胶过期或品质不好.贴片胶粘度太好.从冰箱中取出后未能恢 ...

  7. Linux useradd userdel groupadd groupdel gpasswd(组成员管理) id groups

    添加用户 useradd [选项] 用户名 -u :指定UID标记号 -d:指定宿主目录,缺省为/home/用户名 -g:指定所属的基本组(组名或GID) -G: 指定所属的附加组(组名或GID) - ...

  8. 重新编译mysqldump,使mysqldump具有进度输出功能

    重新编译mysql,使mysqldump具有进度输出功能 安装编译过程所必须的依赖包和环境 yum install -y gcc cmake boost boost-build boost-devel ...

  9. JS 获取和返填单选按钮Value值

    1.获取Radio值 $('input[name="sex"]:checked ').val(); 2.返填Radio值 $('input[name="sex" ...

  10. 磁盘阵列(RAID)

    RAID 0亦称为带区集.它将两个以上的磁盘并联起来,成为一个大容量的磁盘.在存放数据时,分段后分散存储在这些磁盘中,因为读写时都可以并行处理,所以在所有的级别中,RAID 0的速度是最快的.但是RA ...