Servlet——理解会话Session
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的更多相关文章
- 理解会话Session
- [转载]深入理解HTTP Session
深入理解HTTP Session session在web开发中是一个非常重要的概念,这个概念很抽象,很难定义,也是最让人迷惑的一个名词,也是最多被滥用的名字之一,在不同的场合,session一次的 ...
- 重温Servlet学习笔记--session对象
session的类型是属于HttpSession,HttpSession是由javaWeb提供的,用来会话跟踪的类.session是服务器端对象,保存在服务器端. HttpSession是servle ...
- 理解HTTP session原理及应用
转自:http://www.2cto.com/kf/201206/135471.html 一.术语session在我的经验里,session这个词被滥用的程度大概仅次于transaction,更加有趣 ...
- [serverlet][转载: 深入理解HTTP Session]
[serverlet][转载: 深入理解HTTP Session] 标签(空格分隔): 未分类 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任. ...
- 深入理解HTTP Session
深入理解HTTP Session session在web开发中是一个非常重要的概念,这个概念很抽象,很难定义,也是最让人迷惑的一个名词,也是最多被滥用的名字之一,在不同的场合,session一次的 ...
- {转} 深入理解 HTTP Session
session在web开发中是一个非常重要的概念,这个概念很抽象,很难定义,也是最让人迷惑的一个名词,也是最多被滥用的名字之一,在不同的场合,session一次的含义也很不相同.这里只探讨HTTP S ...
- 简单PHP会话(session)说明
现在程序员愈发的不容易了,想要精通,必然要寻本溯源,这其实与目前泛滥的愈发高级的语言以及众多的框架刚好相反,因为它们在尽可能的掩盖本源使其简单,个人称之为程序员学习悖论. 注:作者接触web开发和ph ...
- jfc在jsp页面画图,不将图片存在服务器端,只存入会话session(可用)
jfc在jsp页面画图,不将图片存在服务器端,只存入会话session.其中主要用到jfc的一个servlet类. <%@ page contentType="text/html;ch ...
随机推荐
- MySQL数据库笔记三:数据查询语言(DQL)与事务控制语言(TCL)
五.数据查询语言(DQL) (重中之重) 完整语法格式: select 表达式1|字段,.... [from 表名 where 条件] [group by 列名] [having 条件] [order ...
- Linux工具之top
top命令详解: 第一行:10:01:23----当前系统时间 126days,14:29------系统已经运行了126天14小时29分钟(在这期间没有重启过) 2users------当前 ...
- 代码检查工具sonarqube介绍
SonarQube 是一款用于代码质量管理的开源工具,它主要用于管理源代码的质量.通过插件形式,可以支持众多计算机语言. 比如 java, C#, go,C/C++, PL/SQL,Cobol,Jav ...
- QTP(12)
练习:录制两位数加法器加法计算后退出的步骤,对两个加数做随机数参数化,随机数范围是0-50,在计算后获得被测系统计算的结果,判断如果结果等于100,msgbox提示“满分”,如果结果在80和99之间, ...
- mac+django(1.8.2)+uwsgi+nginx 部署
一. uwsgi 安装 检验 配置uwsgi.ini 1. 安装 pip3 install uwsgi 2. 检验 方法一(uwsgi启动文件): test.py内容如下: def applicati ...
- puppet负载均衡之nginx+passenger
由于3.x系列已不再支持mongrel,所以就采用nginx+passenger来做负载均衡:之前有发过nginx+mongrel,puppet version是2.7系列的,所以还是可以用的: 环境 ...
- Qt实现多国语言(即界面翻译)可实时进行切换
.在工程文件添加 TRANSLATIONS = debug/lang_English.ts \ debug/lang_Chinese.ts .在需要翻译的地方用上tr 例如:setText(tr(&q ...
- Flyway详解以及Springboot集成Flyway(转)
Flayway是一款数据库版本控制管理工具,,支持数据库版本自动升级,Migrations可以写成sql脚本,也可以写在java代码里:不仅支持Command Line和java api ,也支持Bu ...
- 【agc004d】Teleporter
题目大意 一棵树,改变一些边的父亲,使得深度不超过k. 解题思路 我一开始就想到了贪心,结果莫名其妙的把这种方法给否决了, 然后考虑优化树形dp,然后优化失败⊙﹏⊙ 贪心思路很简单,也很好感受出来,从 ...
- mysql 导出导入数据库(Mysqldump)备份
使用mysql不熟练啊!!! mysqldump导出数据库,必须以cmd命令行的形式,在Navicat中以新建查询形式使用Mysqldump不好使的.(本来使用Navicat转储SQL,再导入SQL, ...