`
xiaoyaozijacky
  • 浏览: 14501 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java基础-关于session的详细解释(一)

阅读更多
转载自:http://hi.baidu.com/zbzb/blog/item/9013d0ca2ad45241f31fe763.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的对话框。

  
分享到:
评论

相关推荐

    tomcat7-redis-session-manager-java6-2.0.0.zip

    标题中的"tomcat7-redis-session-manager-java6-2.0.0.zip"指的是一个针对Tomcat 7的Redis Session Manager实现,版本为2.0.0,且兼容Java 6环境。这个组件的主要功能是将Tomcat服务器中的用户会话(Session)数据...

    tomcat-redis-session-manager

    `tomcat-redis-session-manager`就是这样一款解决方案,它将Tomcat的session管理与Redis相结合,实现了跨服务器的session共享。 首先,让我们理解`tomcat-redis-session-manager`的核心概念。这是一个开源项目,它...

    tomcat-redis-session-manager tomcat+nginx+redis集群所需jar

    这个"tomcat-redis-session-manager tomcat+nginx+redis集群所需jar"压缩包提供了在这样的架构中实现会话共享所需的Java类库。下面将详细解释其中涉及的技术点: 1. **Apache Tomcat**: Apache Tomcat是一款开源的...

    java-WebSocket-1.3.7.jar和java-WebSocket-1.3.4.jar

    Java WebSocket 是一个轻量级、高性能的WebSocket客户端与服务器端实现库,主要为Java开发者提供在Web应用中实现实时双向通信的能力。标题提到的"java-WebSocket-1.3.7.jar"和"java-WebSocket-1.3.4.jar"是这个库的...

    tomcat-redis-session-manager-master.zip

    本文将围绕“tomcat-redis-session-manager-master.zip”这个压缩包中的源码,深入探讨如何使用Redis实现Tomcat的session共享,并提供详尽的知识点解析。 首先,我们要理解Tomcat的session管理基础。在默认情况下,...

    redis-tomcat8以上集群所需要的jar :tomcat-redis-session-manager-master 等

    本篇将详细讲解在Tomcat 8及以上版本中,如何利用`tomcat-redis-session-manager`实现基于Redis的Session共享,以及集群所需的jar包。 首先,我们来看标题和描述中提到的关键组件——`tomcat-redis-session-manager...

    Java中设置session的详细解释.docx

    在Java编程中,Session是Web开发中的一个关键概念,它主要用于在客户端和服务器之间保持状态。在HTTP协议中,由于其无状态的特性,每次请求都被视为独立的,无法跟踪用户的交互历史。为了克服这个问题,Session机制...

    hibernate的核心接口--Session

    - **一级缓存**: Session 的一级缓存是由其实现类 `SessionImpl` 中的 `persistenceContext` 属性所包含的一系列 Java 集合构成。这些集合用来存储通过 Session 加载的对象。当应用程序通过 Session 进行 CRUD 操作...

    memcached(十一)memcached-session-manager

    "memcached(十一)memcached-session-manager" 这个标题指的是一个关于memcached缓存系统与session管理的系列教程的第十一部分。在这个教程中,重点可能是如何使用memcached来存储和管理Web应用中的session数据,以...

    一个简单的JAVA-JAIN-SIP客户端,可以连接SIP服务端发起呼叫

    Java Jain SIP是一个强大的开源库,用于在Java平台上构建SIP(Session Initiation Protocol)应用程序。这个简单的JAVA-JAIN-SIP客户端示例展示了如何利用该库与SIP服务器进行交互,实现登录和发起呼叫的基本功能。...

    chexagon/redis-session-manager

    【标题】"chexagon/redis-session-manager" 是一个针对Java Web应用的session管理解决方案,它主要用于在基于JDK 8和Tomcat 8的环境中实现Redis作为session存储的工具。这个工具允许开发者将Web应用中的用户session...

    java源码包---java 源码 大量 实例

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    tomcat-redis-session管理 使用说明

    以下将详细解释这一技术的原理、实施步骤以及优势。 【一、Tomcat Session管理基础】 Tomcat是Apache软件基金会的一个开源项目,作为Java Servlet容器,它支持Web应用程序的运行。默认情况下,Tomcat将Session数据...

    JavaWeb基础-Cookie和Session的简单使用案例

    每个Session都关联一个唯一的Session ID,这个ID通过Cookie或者URL重写等方式发送到客户端。客户端每次请求时,服务器根据Session ID找到对应的Session数据,实现用户会话的维护。在JavaWeb中,我们使用HttpSession...

    Nginx+Tomcat+Memcached-Session-Manager集群Session共享

    在本篇文章中,我们将深入探讨如何使用Nginx、Tomcat和Memcached-Session-Manager(MSM)来构建一个集群环境,并实现Session共享。这涉及到集群搭建、分布式应用以及缓存管理等多个方面的IT知识。下面将详细展开这些...

    一个关于Session的小demo

    1. **初始化Session**:在JSP页面中,我们可以使用`<jsp:useBean>`标签或者Java代码来创建一个新的Session。例如: ```java HttpSession session = request.getSession(); ``` 2. **设置Session属性**:一旦...

    java基础及javaWEB

    Java基础知识涵盖了Java语言的核心概念和编程技能,而Java Web则是Java在互联网开发领域的应用。毕向东和方立勋是知名的Java技术教育者,他们分别在Java基础和Java Web方面拥有深入的研究,并将这些知识整理成为教程...

    apache-tomcat-7.0.47-memcached-各种序列化策略-session共享

    6. **apache-tomcat-7.0.47-memcached-java-session共享.rar**:最基础的Java序列化,使用Java内置的ObjectOutputStream和ObjectInputStream进行对象的序列化和反序列化。虽然简单,但序列化的对象通常体积较大,不...

    java---面试key

    以下是对这些知识点的详细解释: 1. **String对象创建**: 当我们创建`String s = new String("xyz");`时,实际上是创建了两个对象:一个是在常量池中的"xyz"字符串对象,另一个是堆内存中新创建的String对象,它...

Global site tag (gtag.js) - Google Analytics