java session 详解

原网址:http://blog.sina.com.cn/s/blog_670b6d880101deff.html

一、术语session

  在我的经验里,session这个词被滥用的程度大概仅次于transaction,更加有趣的是transaction和session在某些语境下的含义是相同的。

  session,中文经常翻译为会话,其本来的含义是指有始有终的一系列动作/消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程能称之为一个session。有时候我们能看到这样的话“在一个浏览器会话期间,...”,这里的会话一词用的就是其本义,是指从一个浏览器窗口打开到关闭这个期间①。最混乱的是“用户(客户端)在一次会话期间”这样一句话,他可能指用户的一系列动作(一般情况下是同某个具体目的相关的一系列动作,比如从登录到选购商品到结账登出这样一个网上购物的过程,有时候也被称为一个transaction),然而有时候也可能仅仅是指一次连接,也有可能是指含义①,其中的差别只能靠上下文来推断②。

  然而当session一词和网络协议相关联时,他又往往隐含了“面向连接”和/或“保持状态”这样两个含义,“面向连接”指的是在通信双方在通信之前要先建立一个通信的渠道,比如打电话,直到对方接了电话通信才能开始,和此相对的是写信,在你把信发出去的时候你并不能确认对方的地址是否正确,通信渠道不一定能建立,但对发信人来说,通信已开始了。“保持状态”则是指通信的一方能够把一系列的消息关联起来,使得消息之间能互相依赖,比如一个服务员能够认出再次光临的老顾客并且记得上次这个顾客还欠店里一块钱。这一类的例子有“一个TCP session”或“一个POP3 session”③。

  而到了web服务器蓬勃发展的时代,session在web研发语境下的语义又有了新的扩展,他的含义是指一类用来在客户端和服务器之间保持状态的解决方案④。有时候session也用来指这种解决方案的存储结构,如“把xxx保存在session里”⑤。由于各种用于web研发的语言在一定程度上都提供了对这种解决方案的支持,所以在某种特定语言的语境下,session也被用来指代该语言的解决方案,比如经常把Java里提供的javax.servlet.http.HttpSession简称为session⑥。

  鉴于这种混乱已不可改动,本文中session一词的运用也会根据上下文有不同的含义,请大家注意分辨。

  在本文中,使用中文“浏览器会话期间”来表达含义①,使用“session机制”来表达含义④,使用“session”表达含义⑤,使用具体的“HttpSession”来表达含义⑥

  二、HTTP协议和状态保持

  HTTP协议本身是无状态的,这和HTTP协议本来的目的是相符的,客户端只需要简单的向服务器请求下载某些文件,无论是客户端还是服务器都没有必要纪录彼此过去的行为,每一次请求之间都是独立的,好比一个顾客和一个自动售货机或一个普通的(非会员制)大卖场之间的关系相同。

  然而聪明(或贪心?)的人们非常快发现如果能够提供一些按需生成的动态信息会使web变得更加有用,就像给有线电视加上点播功能相同。这种需求一方面迫使HTML逐步添加了表单、脚本、DOM等客户端行为,另一方面在服务器端则出现了CGI规范以响应客户端的动态请求,作为传输载体的HTTP协议也添加了文件上载、cookie这些特性。其中cookie的作用就是为了解决HTTP协议无状态的缺陷所作出的努力。至于后来出现的session机制则是又一种在客户端和服务器之间保持状态的解决方案。

  让我们用几个例子来描述一下cookie和session机制之间的差别和联系。笔者原来常去的一家咖啡店有喝5杯咖啡免费赠一杯咖啡的优惠,然而一次性消费5杯咖啡的机会微乎其微,这时就需要某种方式来纪录某位顾客的消费数量。想象一下其实也无外乎下面的几种方案:

  1、该店的店员非常厉害,能记住每位顾客的消费数量,只要顾客一走进咖啡店,店员就知道该怎么对待了。这种做法就是协议本身支持状态。

  2、发给顾客一张卡片,上面记录着消费的数量,一般更有个有效期限。每次消费时,如果顾客出示这张卡片,则此次消费就会和以前或以后的消费相联系起来。这种做法就是在客户端保持状态。

  3、发给顾客一张会员卡,除了卡号之外什么信息也不纪录,每次消费时,如果顾客出示该卡片,则店员在店里的纪录本上找到这个卡号对应的纪录添加一些消费信息。这种做法就是在服务器端保持状态。

  由于HTTP协议是无状态的,而出于种种考虑也不希望使之成为有状态的,因此,后面两种方案就成为现实的选择。具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。同时我们也看到,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的,但实际上他更有其他选择。

  三、理解cookie机制 

  cookie机制的基本原理就如上面的例子相同简单,不过更有几个问题需要解决:“会员卡”怎么分发;“会员卡”的内容;及客户怎么使用“会员卡”。

  正统的cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特别的指示以提示浏览器按照指示生成相应的cookie。然而纯粹的客户端脚本如JavaScript或VBScript也能生成cookie。

  而cookie的使用是由浏览器按照一定的原则在后台自动发送给服务器的。浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置,则把该cookie附在请求资源的HTTP请求头上发送给服务器。意思是麦当劳的会员卡只能在麦当劳的店里出示,如果某家分店还发行了自己的会员卡,那么进这家店的时候除了要出示麦当劳的会员卡,还要出示这家店的会员卡。

  cookie的内容主要包括:名字,值,过期时间,路径和域。

  其中域能指定某一个域比如.google.com,相当于总店招牌,比如宝洁公司,也能指定一个域下的具体某台机器比如www.google.com或froogle.google.com,能用飘柔来做比。

  路径就是跟在域名后面的URL路径,比如/或/foo等等,能用某飘柔专柜做比。

  路径和域合在一起就构成了cookie的作用范围。

  如果不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览器会话期的cookie被称为会话cookie。会话cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。

  存储在硬盘上的cookie能在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存里的cookie,不同的浏览器有不同的处理方式。对于IE,在一个打开的窗口上按Ctrl-N(或从文件菜单)打开的窗口能和原窗口共享,而使用其他方式新开的IE进程则不能共享已打开的窗口的内存cookie;对于Mozilla Firefox0.8,所有的进程和标签页都能共享同样的cookie。一般来说是用javascript的window.open打开的窗口会和原窗口共享内存cookie。浏览器对于会话cookie的这种只认cookie不认人的处理方式经常给采用session机制的web应用程式研发者造成非常大的困扰。

  下面就是个goolge设置cookie的响应头的例子

HTTP/1.1 302 Found
Location: http://www.google.com/intl/zh-CN/
Set-Cookie: PREF=ID=0565f77e132de138:NW=1:TM=1098082649:LM=1098082649:S=KaeaCFPo49RiA_d8; expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.com
Content-Type: text/html


  这是使用HTTPLook这个HTTP Sniffer软件来俘获的HTTP通讯纪录的一部分



  浏览器在再次访问goolge的资源时自动向外发送cookie


  使用Firefox能非常容易的观察现有的cookie的值

  使用HTTPLook配合Firefox能非常容易的理解cookie的工作原理。



  IE也能设置在接受cookie前询问


  这是个询问接受cookie的对话框。

  四、理解session机制

 session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。

  当程式需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识 - 称为session id,如果已包含一个session id则说明以前已为此客户端创建过session,服务器就按照session id把这个session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个和此session相关联的session id,session id的值应该是个既不会重复,植蝗菀妆徽业焦媛梢苑略斓淖址???飧?ession id将被在本次响应中返回给客户端保存。

  保存这个session id的方式能采用cookie,这样在交互过程中浏览器能自动的按照规则把这个标识发挥给服务器。一般这个cookie的名字都是类似于SEEESIONID,而。比如weblogic对于web应用程式生成的cookie,JSESSIONID=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764,他的名字就是JSESSIONID。

  由于cookie能被人为的禁止,必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。经常被使用的一种技术叫做URL重写,就是把session id直接附加在URL路径的后面,附加方式也有两种,一种是作为URL路径的附加信息,表现形式为http://...../xxx;jsessionid=ByOK ... 99zWpBng!-145788764另一种是作为查询字符串附加在URL后面,表现形式为http://...../xxx?jsessionid=ByOK ... 99zWpBng!-145788764
这两种方式对于用户来说是没有差别的,只是服务器在解析的时候处理的方式不同,采用第一种方式也有利于把session id的信息和正常程式参数区分开来。

  为了在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个session id。

  另一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。

  这种技术目前已较少应用,笔者接触过的非常古老的iPlanet6(SunONE应用服务器的前身)就使用了这种技术。实际上这种技术能简单的用对action应用URL重写来代替。

  在谈论session机制的时候,常常听到这样一种误解“只要关闭浏览器,session就消失了”。其实能想象一下会员卡的例子,除非顾客主动对店家提出销卡,否则店家绝对不会轻易删除顾客的资料。对session来说也是相同的,除非程式通知服务器删除一个session,否则服务器会一直保留,程式一般都是在用户做log off的时候发个指令去删除session。然而浏览器从来不会主动在关闭之前通知服务器他将要关闭,因此服务器根本不会有机会知道浏览器已关闭,之所以会有这种错觉,是大部分session机制都使用会话cookie来保存session id,而关闭浏览器后这个session id就消失了,再次连接服务器时也就无法找到原来的session。如果服务器设置的cookie被保存到硬盘上,或使用某种手段改写浏览器发出的HTTP请求头,把原来的session id发送给服务器,则再次打开浏览器仍然能够找到原来的session。

  恰恰是由于关闭浏览器不会导致session被删除,迫使服务器为seesion设置了一个失效时间,当距离客户端上一次使用session的时间超过这个失效时间时,服务器就能认为客户端已停止了活动,才会把session删除以节省存储空间。

  五、理解javax.servlet.http.HttpSession

转载于:https://www.cnblogs.com/hujunzheng/p/4154071.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/531549.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Session监听器

Session监听器&#xff0c;是用来监听session对象创建和关闭的。有时我们需要在session创建或关闭时执行一些操作。这是就可以使用Session Listenner。1.在项目的web.xml文件中添加如下代码&#xff1a;[html] view plaincopy <!--添加Session监听器--> <listener>…

陷阱计算机音乐谱大全,陷阱 原版C调-王北车-和弦谱-《弹吧》官网tan8.com-和弦谱大全,学吉他,秀吉他...

E此浏览器不支持画布前奏扫弦 C Fm C Fm C Am F G7主C Em一封信两年都没动笔C Am三个字过了几个四季F G你是有多想逃避Em Am来不及问问你Dm G我已经错过相爱的日期C Em那天你消失在人海里C Am你的背影沉默得让人恐惧F G Em Am你说的那些问题 我回答得很坚定Dm G偏偏那个时候我最…

江苏省计算机学会博士论文,江苏学会网 欢迎您成为江苏省计算机学会会员

根据苏科协发【2004】5号文件新精神&#xff0c;以单位名义加入学术团体&#xff0c;只成为该学术团体的单位会员&#xff0c;而非意味着该单位所有成员团体入会。该文件的实质是鼓励以个人身份加入学术团体。因此&#xff0c;欢迎本省内凡符合江苏省计算机学会会员条件的人士&…

Packet for query is too large(1767212 1048576)mysql在存储图片时提示图片过大

原网址&#xff1a;http://blog.csdn.net/bigbird2012/article/details/6304417 错误现象&#xff1a;Packet for query is too large(1767212 > 1048576),You can change this value on the server by setting the max_allow_packet variable.解决办法&#xff1a;MySQL的一…

江苏省公务员计算机类130分,130分,在江苏省考中是什么水平?

原标题&#xff1a;130分&#xff0c;在江苏省考中是什么水平&#xff1f;关键词回复获取更多详情更多公考常识&#xff0c;后台回复【常识】更多公考素材&#xff0c;后台回复【素材】【130】在江苏算是公考进面的一道普遍门槛。对于2020江苏省考的考生&#xff0c;130分应定为…

js连续指定两次或者多次的click事件(解决办法)

setTimeout (表达式,延时时间)setTimeout(表达式,交互时间)延时时间/交互时间是以豪秒为单位的(1000ms1s) setTimeout 在执行时,是在载入后延迟指定时间后,去执行一次表达式,仅执行一次setTimeout 在执行时,它从载入后,每隔指定的时间就执行一次表达式 if(ischoose false){is…

软件测试项目时间一般多少钱,项目的时间进度该如何估算?

后来&#xff0c;开发一周左右&#xff0c;发现原来使用的模块&#xff0c;要用新的接口A&#xff0c;但是接口A还不能满足我现有的需求&#xff0c;必须需要程序员A重新包装给我&#xff0c;这样再等了一下午&#xff0c;第二天&#xff0c;问题不断&#xff0c;不停的跟程序员…

js选择目录

找了好久&#xff0c;终于找到了! function browseFolder(path) {//打开本地目录&#xff08;目录选择功能&#xff09;try {var Message "\u8bf7\u9009\u62e9\u6587\u4ef6\u5939"; //选择框提示信息var Shell new ActiveXObject("Shell.Application");v…

计算机寄存器端口,CPU和外设之间的数据传送方式有哪几种

数据传输(data transmission)&#xff0c;指的是依照适当的规程&#xff0c;经过一条或多条链路&#xff0c;在数据源和数据宿之间传送数据的过程。也表示借助信道上的信号将数据从一处送往另一处的操作。CPU与外设之间的数据传输有以下三种方式&#xff1a;程序方式、中断方式…

js 获得radio的值

var tmp document.getElementsByName("foodtype"); for(var i0; i<tmp.length; i)if(tmp.item(i).checked){alert(tmp.item(i).getAttribute("value"));} 转载于:https://www.cnblogs.com/hujunzheng/p/4167897.html

js实现打开本地文件或文件夹

原网址&#xff1a;http://blog.csdn.net/cofesun/article/details/7904887javascript有个特殊的对象ActiveXObject&#xff0c;通过它可以访问windows的本地文件系统和应用程序<script>function openFileIIs(filename){ try{ var objnew ActiveXObject("ws…

茌平计算机中考成绩查询,中考成绩查询系统入口2021

湘潭市的中考成绩查询&#xff0c;需要在通道开通之后进行&#xff0c;那么查询通道在哪里呢&#xff1f;想必大家都很想知道。下面出国留学网小编为大家带来湘潭中考成绩查询系统入口2021&#xff0c;仅供参考&#xff0c;欢迎阅读。拓展阅读&#xff1a;中考后有哪些选择出路…

java生成excel文件

首先下载jexcelapi_2_6_12.tar.gz&#xff0c;解压后将里面的jxl.jar复制到WEB-INF/lib目录下面      String filePath request.getParameter("filePath");filePathfilePath.replaceAll("\\\\", "/");FileOutputStream os new FileOutp…

win10证书服务器不可用,win10系统提示“安全证书的吊销信息不可用”的修复方法...

在windows10系统下一位用户遇到了奇怪的问题&#xff0c;该用户表示浏览网页的时候经常会弹出安全警报&#xff1a;该镇点安全证书的吊销信息不可用。是否继续&#xff1f; 的报错弹窗&#xff0c;这是怎么回事呢&#xff1f;其实&#xff0c;该问题是由于ie浏览器中的设置出现…

jsp获得文件的绝对路径

当前WEB应用的物理路径&#xff1a;<%application.getRealPath("/")%>当前访问的JSP文件的物理路径&#xff1a;<%application.getRealPath(request.getRequestURI())%& gt;当前访问jsp文件的所在目录的物理路径&#xff1a;<% String pathapplic…

清明节游戏服务器维护,清明节游戏活动【4月2日--4月16日】

活动一&#xff1a;百鬼夜行活动时间&#xff1a; 2020年4月2日维护结束----2020年4月16日维护结束活动内容&#xff1a;清明将至&#xff0c;世间阴气逐渐浓郁&#xff0c;总有一些小鬼借机生乱&#xff0c;为了防止百鬼夜行这样的事情再次发生&#xff0c;拜托你前往银栏村和…

错误:document.getElementById(userForm).submit();Object is not a function

表单提交时发生的错误解决办法&#xff1a; 利用这种方法进行表单提交的时候&#xff0c;表单中的元素不能有 name"submit"的元素&#xff0c;否则该元素会与submit()方法造成混淆&#xff0c;导致错误! 转载于:https://www.cnblogs.com/hujunzheng/p/4180252.html

暴走大侠显示进入服务器失败,暴走大侠:常见问题详解,再遇见这样的问题也不再迷糊...

相信玩了这么久的英雄好汉们&#xff0c;对这个游戏的理解已经有了一定的了解。同时也应该有很多疑问&#xff0c;几天就给大家详细的讲解下最近几天大家关心最多的问题。关于门派选择问题&#xff0c;主动技能怎学&#xff1f;答&#xff1a;门派问题的话&#xff0c;这个最好…

mysql数据库移植

在mysql数据库移植的时候&#xff0c;把自己电脑上mysql中data目录的一些重要文件复制到其他电脑上&#xff0c;先备份一下其他电脑上的mysql的data目录&#xff0c;然后替换&#xff01; 例如我的mysql默认的数据库文件位置&#xff1a; C:\ProgramData\MySQL\MySQL Server 5.…

win系统如何连接共享服务器,window7 pro 访问局域网内共享服务器

您好&#xff0c;Windows 7 相比较Windows XP增强了安全性等功能。或许您之前设置对Windows XP访问的权限并不支持Windows 7 。可能因为服务器不识别Windows 7新的连接凭据(前提是存在过旧的连接凭据)。建议您在文件服务器端重新设置一下共享文件夹的本地 NTFS 权限&#xff0c…