Cookie和Session的联系与区别

来源:互联网 发布:laravel php artisan 编辑:程序博客网 时间:2024/05/29 08:04
一、Cookie和Session是什么?
     Cookie是当你浏览某网站时,网站存储在你机器上的一个小文本文件,它记录了你的用户ID,密码、浏览过的网页、停留的时间等信息,当你再次来到该网站时,网站通过读取Cookie,得知你的相关信息,就可以做出相应的动作,如在页面显示欢迎你的标语,或者让你不用输入ID、密码就直接登录等。如果你不小心关闭了网页,在次恢复时,依然可以进入已经登录过的页面。但是,当你关闭浏览器时,除非你设置了自动登录,否则需要再次输入ID和密码。    
     Session在Web开发环境下的语义又有了新的扩展,它的含义是指一类用来在客户端与服务器端之间保持状态的解决方案。有时候Session也用来指这种解决方案的存储结构,就是在服务器端保存用户的相关信息。

二、为什么会产生Cookie和Session?
     为了解决HTTP协议无状态的缺陷!HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。意思也就是每打开一个网页,上下的信息是不能联系在一起的,如果需要一步的信息要重新输入。因而为了解决这个问题,使用Cookie和Session机制,将用户的信息保存下来,从而使得上下一致。

三、Cookie的具体实现
     Cookie就是由服务器发给客户端的特殊信息,而这些信息以文本文件的方式存放在客户端,然后客户端每次向服务器发送请求的时候都会带上这些特殊的信息。让我们说得更具体一些:当用户使用浏览器访问一个支持Cookie的网站的时候,用户会提供包括用户名在内的个人信息并且提交至服务器;接着,服务器在向客户端回传相应的超文本的同时也会发回这些个人信息,当然这些信息并不是存放在HTTP响应体(Response Body)中的,而是存放于HTTP响应头(Response Header);当客户端浏览器接收到来自服务器的响应之后,浏览器会将这些信息存放在一个统一的位置。可以查看浏览器的设置,查看cookie。服务器在接收到来自客户端浏览器的请求之后,就能够通过分析存放于请求头的Cookie得到客户端特有的信息,从而动态生成与该客户端相对应的内容。通常,我们可以从很多网站的登录界面中看到“请记住我”这样的选项,如果你勾选了它之后再登录,那么在下一次访问该网站的时候就不需要进行重复而繁琐的登录动作了,而这个自动登录功能就是通过Cookie实现的。  这也就包括两个过程:一 cookie的发送:1.创建Cookie对象;2.设置最大时效(分 为会话cookie和永久cookie;如果不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览会话期的cookie被称为会话cookie。会话cookie一般不保存在硬盘上而是保存在内存里。如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie依然有效直到超过设定的过期时间。);3.将Cookie 放入到HTTP响应报头;  二 cookie的读取: 1.调用request.getCookie(需要服务器和浏览器都支持这个函数);2.对数组进行循环,调用每个cookie的getName方法,直到找到感兴趣的cookie为止。

四、Session的相关内容
     session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。它是在服务器端保存用户的信息。用户需要申请在服务器端建立一个session ID。当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否已包含了一个session标识称为session id),如果已包含则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(检索不到,会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。保存这个session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给服务器。一般这个cookie的名字都是类似于SEEESIONID。Session ID一般会写在数据库里。 
●session什么时候被创建  一个常见的错误是以为session在有客户端访问时就被创建,然而事实是直到某server端程序(如Servlet)调用HttpServletRequest.getSession(true)这样的语句时才会被创建。
●session何时被删除  session在下列情况下被删除: 
A.程序调用HttpSession.invalidate() 
B.距离上一次收到客户端发送的session id时间间隔超过了session的最大有效时间
C.服务器进程被停止  再次注意关闭浏览器只会使存储在客户端浏览器内存中的session cookie失效,不会使服务器端的session对象失效。

五、二者之间的联系与区别
     联系:二者都可以用来保存用户的信息, Session的使用要求用户浏览器必须支持Cookie, 如果浏览器不支持使用Cookie,或者设置为禁用Cookie,那么将不能使用Session。用户在进行访问时,服务器会通过查找session,将用户的session ID传给浏览器,而浏览器则将这个ID以cookie的形式保存在浏览器的内存中。也可以说cookie是session在浏览器中的标识。当然也可以以其他的方式保存。 
     区别: 
     ●cookie是保存在浏览器的内存中,而session则是保存在服务器端。 
     ●session与cookie相比,当你登陆访问页面的时候,使用cookie可以自动登录,如果有人另外一个客户端同时登录。这个时候,服务器就会检查其session ID。如果已经有相同的session ID登录,就不会允许再登录。这样可以防止同一用户多次登录,保障公司的利益。 
     ●用户可以通过在浏览器设置不保存cookie,而当用户登录时,服务器会将session ID以密文的形式写在HTTP的响应报头,从而实现访问的上下连贯。 
     ●cookie放置在浏览器内存中,使用起来更加灵活方便,session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能 
     ●SESSION是保存在服务端的;Cookie是保存在客户机器上的Session不可伪造;Cookie可以伪造!并且session不传递,因此,session比cookie更加的安全。

六、几个应当注意的问题
     ●Cookie的过期和Session的超时有什么区别 
     会话的超时由服务器来维护,它不同于Cookie的失效日期。首先,会话一般基于驻留内存的cookie不是持续性的cookie,因而也就没有截至日期。即使截取到JSESSIONID cookie,并为它设定一个失效日期发送出去。浏览器会话和服务器会话也会截然不同。
     ●session cookie和session对象的生命周期是一样的吗 
     当用户关闭了浏览器虽然session cookie已经消失,但session对象仍然保存在服务器端
     ●是否只要关闭浏览器,session就消失了 
     程序一般都是在用户做log off的时候发个指令去删除session,然而浏览器从来不会主动在关闭之前通知服务器它将要被关闭,因此服务器根本不会有机会知道浏览器已经关闭。服务器会一直保留这个会话对象直到它处于非活动状态超过设定的间隔为止。 之所以会有这种错误的认识,是因为大部分session机制都使用会话cookie来保存session id,而关闭浏览器后这个session id就消失了,再次连接到服务器时也就无法找到原来的session。 如果服务器设置的cookie被保存到硬盘上,或者使用某种手段改写浏览器发出的HTTP请求报头,把原来的session id发送到服务器,则再次打开浏览器仍然能够找到原来的session。 恰恰是由于关闭浏览器不会导致session被删除,迫使服务器为session设置了一个失效时间,当距离客户上一次使用session的时间超过了这个失效时间时,服务器就可以认为客户端已经停止了活动,才会把session删除以节省存储空间。 由此我们可以得出如下结论:  关闭浏览器,只会是浏览器端内存里的session cookie消失,但不会使保存在服务器端的session对象消失,同样也不会使已经保存到硬盘上的持久化cookie消失。
     ●打开两个浏览器窗口访问应用程序会使用同一个session还是不同的session 
     通常session cookie是不能跨窗口使用的,当你新开了一个浏览器窗口进入相同页面时,系统会赋予你一个新的session id,这样我们信息共享的目的就达不到了。  此时我们可以先把session id保存在persistent cookie中(通过设置session的最大有效时间),然后在新窗口中读出来,就可以得到上一个窗口的session id了,这样通过session cookie和persistent cookie的结合我们就可以实现了跨窗口的会话跟踪。(Session cookie 又叫 transient  cookie,它被存储在临时的存储器中,浏览器关闭后不会保留;  Persistent cookie 又叫 permenent cookie,它被存储在用户的硬件上,直到过期或这是用户自行删除)
0 0
原创粉丝点击