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. javascrip标签的href属性

    1.标签的href属性用于指定超链接目标的URL.href属性的值可以是任何有效文档的相对或绝对URL,包括片段ID和javascript代码段. 2.javascript:这是一个虚假的协议.所谓的 ...

  2. linux递归查找目录下所有文件夹以及文件

    相对于ls或者ll,可能find在这个时候更加给力 先看我的目录结构 tree命令是查看目录的结构,而且最后会列出所有的directory的数目以及文件夹的数目...好像我们接下来要做的就没有必要了, ...

  3. 实现单点登录功能的思路以及kafka同步数据

    单点登录以及用户数据同步思路与方案 当公司业务分布于多个子系统时, 同一用户在A系统注册,即可在其他所有关联系统使用, 并支持登录A系统后,自动在其他系统登录,退出同理. 在A平台修改通用的用户数据( ...

  4. 笔记 前端的$dom操作

    jqueryDOM操作  1.  页面加载  函数 $( function(){ 具体内容 } );        表示页面加载函数   2  dom 类操作 text() - 设置或返回所选元素的文 ...

  5. STM32 stm32fxxx_flash.icf文件的作用详解

    文章转载自:https://blog.csdn.net/weibo1230123/article/details/80142210 每个芯片开发商都会针对每款芯片来编写一个.icf文件就是传说中的链接 ...

  6. 2.NumPy简介

    一:NumPy简介 • 官网链接:http://www.numpy.org/ • NumPy教程链接:https://www.yiibai.com/numpy/ • NumPy是Python语言的一个 ...

  7. Networker软件安装

  8. libusb bulk

    https://github.com/IzyaSoft/EasyUsb https://github.com/ztguang/libusb-usbip-bulktransfer/blob/master ...

  9. Netty TCP 通信失败

    前段时间,在搞Netty TCP 通信,踩了一些坑,今天就在这篇总结一下 Netty通信失败原因 Netty TCP 通信失败的可能原因: 1.服务端或客户端,其中一端没有正常启动 2.是否在正确的位 ...

  10. XShell 假死

    使用vim时因为使用windows word带来的坏习惯经常喜欢ctrl+s ,而这个造成的结果就是xshell假死,解决办法是ctrl+q