session和cookie的区别

最近在复习那个单点登陆,在session和那个cookie之间的那个概念神马的有点模糊,特地又查了下资料,整理下方便以后忘了的时候再回头看看。

 

 

web协议,即HTTP是一个无状态的协议,客户端每发送一次请求,都会打开一个连接通道,即使是请求同一个页面。web服务端并不会去区分请求来自哪个客户端,只要是单独的http连接请求,都会打开单独的连接通道,这与c/s模式有着质的不同。但是,我们平时的应用是有状态的,浏览器和服务器之间约定:通过使用Cookie技术来维持应用的状态。以下是对SessionCookie的介绍:

cookie机制和session机制的区别
*************************************************************************************
Cookie
是客户端的存储空间,由浏览器来维持。具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。同时我们也看到,由于才服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的,但实际上还有其他选择,比如说重写URL和隐藏表单域。

Session

1、什么是Session

Session的信息保存在服务器Session是基于访问的进程,记录了一个访问的开始到结束,被用于表示一个持续的连接状态,当浏览器或进程关闭之后,session也消失了。

 

2Session机制:

session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。
当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否包含了一个session标识-称为session id(怎么生成的?),如果已经包含一个session id则说明以前已经为此客户创建过session,服务器就按照session id把这个session检索出来使用(如果检索不到,可能会新建一个,这种情况可能出现在服务端已经删除了该用户对应的session对象,但用户人为地在请求的URL后面附加上一个JSESSION的参数)。如果客户请求不包含session id,则为此客户创建一个session并且同时生成一个与此session相关联的session id,这个session id将在本次响应中返回给客户端保存(保存后,session id的生存周期只是本次会话,关闭浏览器后,再次请求,会生成另一个session id,理解对吗?)。

 

3、保存session id的几种方式(换个问法,Session实现形式?):

1)常见:会话cookie(内存cookiesession cookie),即未设置过期时间的cookie,这个cookie的默认生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。实现机制是当用户发起一个请求的时候,服务器会检查该请求中是否包含sessionid,如果未包含,则系统会创造一个名为JSESSIONID的输出 cookie返回给浏览器(只放入内存,并不存在硬盘中),并将其以HashTable的形式写到服务器的内存里面;当已经包含sessionid是,服务端会检查找到与该session相匹配的信息,如果存在则直接使用该sessionid,若不存在则重新生成新的 session。这里需要注意的是session始终是有服务端创建的,并非浏览器自己生成的

2)自动通过重写URL的方式:把session id附加在URL路径的后面,附加的方式也有两种,一种是作为URL路径的附加信息,另一种是作为查询字符串附加在URL后面。网络在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个session id。如果客户端Cookie禁用,则服务器可以自动通过重写URL的方式来保存Session的值,并且这个过程对程序员透明。

3)表单隐藏字段:服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。

 

4Session在什么时候被创建?

session始终是有服务端创建的,并非浏览器自己生成的。

有人认为session在有客户端访问时就被创建,这个理解是错误的,正确的理解是直到某server端程序调用HttpServletRequest.getSession(true)这样的语句时才被创建。

注意如果JSP没有显示的使用 <% @page session="false"%> 关闭session,则JSP文件在编译成Servlet时将会自动加上这样一条语句HttpSession session = HttpServletRequest.getSession(true);这也是JSP中隐含的session对象的来历。

由于session会消耗内存资源,因此,如果不打算使用session,应该在所有的JSP中关闭它。

 

5Session什么时候被删除?
A
.程序调用HttpSession.invalidate()
B
.距离上一次收到客户端发送的session id时间间隔超过了session的最大有效时间
C
.服务器进程被停止

 

注意:关闭浏览器只会使存储在客户端浏览器内存中的session cookie失效,不会使服务器端的session对象失效,除非此时Server端刚好session失效时间到了。

 

6、是否只要关闭浏览器,session就消失了?

程序一般都是在用户做log off的时候发个指令去删除session,然而浏览器从来不会主动在关闭之前通知服务器它将要被关闭,因此服务器根本不会有机会知道浏览器已经关闭。服务器会一直保留这个会话对象直到它处于非活动状态超过设定的间隔为止。
之所以会有这种错误的认识,是因为大部分session机制都使用会话cookie来保存session id,而关闭浏览器后这个session id就消失了,再次连接到服务器时也就无法找到原来的session。如果服务器设置的cookie被保存到硬盘上,或者使用某种手段改写浏览器发出的HTTP请求报头,把原来的session id发送到服务器,则再次打开浏览器仍然能够找到原来的session。恰恰是由于关闭浏览器不会导致session被删除,迫使服务器为session设置了一个失效时间,当距离客户上一次使用session的时间超过了这个失效时间时,服务器就可以认为客户端已经停止了活动,才会把session删除以节省存储空间。

 

7、打开两个浏览器窗口访问应用程序会使用同一个session还是不同的session

通常session cookie是不能跨窗口使用的,当你新开了一个新的浏览器窗口进入相同页面时,系统会赋予你一个新的session id,这样我们信息共享的目的就达不到了。对session来说是只认id不认人,因此不同的浏览器,不同的窗口打开方式以及不同的cookie存储方式(如会话cookie和持久cookie)都会对这个问题的答案有影响。

(
IE下测试,打开两个浏览器(不是新建窗口,是直接启动两次浏览器),得到的SessionID也是不一样)
要实现跨窗口的会话跟踪,我们可以先把session id保存在persistent cookie(通过设置session的最大有效时间),然后在新窗口中读出来,就可以得到上一个窗口的session id了,这样通过session cookiepersistent cookie的结合我们就可以实现了跨窗口的会话跟踪。

cookie

1、什么是cookie

cookie是一小段文本信息,伴随着用户请求和页面在web服务器和浏览器之间传递cookie包含每次用户访问站点时web应用程序都可以读取的信息。

 

2、为什么要用cookie

因为HTTP协议是无状态的,对于一个浏览器发出的多次请求,web服务器无法区分是不是来源于同一个浏览器,所以,需要额外的数据用于维护会话,cookie正是这样的一段随Http请求一起被传递的额外数据。

ps:cookie可以用来实现自动登陆。

 

3cookie的机制?

    cookie分为内存cookie(浏览器cookie)和持久cookie(文件cookie、硬盘cookie);

内存cookie不设置cookie的过期时间,即不设置cookieExpires属性,表示这个cookie的生命期为浏览器会话期间,cookie将停留在客户端的内存中,只要关闭浏览器,cookie即失效了。

如果内存cookie没有指定域,Domain属性,那么可以在多个不同的站点间共享内存cookie

持久cookie设置了cookie的过期时间,即Expires属性,此时cookie将保存在硬盘上,关闭浏览器再次打开,这些cookie仍然有效直到超过设定的过期时间。

 

4、会话cookie和持久cookie的区别?

如果不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览会话期的cookie被称为会话cookie。会话cookie一般不保存在硬盘上而是保存在内存里。
如果设置了过期时间(setMaxAge(60*60*24)),浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie依然有效直到超过设定的过期时间。存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存的cookie,不同的浏览器有不同的处理方式。(IE下测试通过)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值