• 欢迎来到本博客,希望可以y一起学习与分享

Cookie、session的联系和区别,以及应用场景

网络 benz 4年前 (2017-12-12) 234次浏览 0个评论 扫描二维码
文章目录[隐藏]

基本概念

对于许多人来说,都知道的是,cookie是存储在客户端的,可以用来放需要长期使用的内容,例如用户密码、用户账户等等,服务器是可以获取到cookie的内容的;而session则是存储在服务器端,通过唯一的session_id来区别用户,用于保存用户的登录状态和请求等,客户是不能获取到其内容的。

这对于许多人来说都是比较基础的内容,也是表现形式上的区别,在这里我们深入的了解一下两者。

为什么需要cookie?

对于web程序,有一个需要考虑的问题是如何跟踪用户的会话,照常理来说,一个用户的行为只能对应于一个会话,比如开发购物车应用,就要考虑到用户的购物车中的内容,一个用户的购物车总不能装的是别人的商品吧?跟踪用户的会话就是用来区分不同用户的各自所挑选的商品。

但是Web应用是基于HTTP协议来传输数据的,而HTTP协议是无状态的,在完成传输数据之后,客户端与服务器端的连接就会关闭,对于不同用户发生“将商品放入购物车”的动作时,不能够判断哪一件商品对应哪一位用户。在这里需要使用cookie,来解决HTTP协议在跟踪会话上的不足。

cookie是服务器端给客户端分发的一种凭证,客户端要请求服务,就需要在发送数据时的同时发送cookie,服务器端通过识别cookie的内容,得知用户的身份,就可以知道用户的购物车是那一辆,再将商品放进去就可以了。

cookie的内容

要查看cookie可以在地址栏输入 javascript: alert(document.cookie); 就可以看到网站分发的cookie了。下面是百度上的cookie内容,在有使用cookie的网站使用才可行。

cookie的内容就是这样的字符串,服务器通过读取这样的长长的加密过的cookie来获取用户的信息,这里有BAIDUID(即我的百度账号),以及其他的信息。

cookie的分类

实际上cookie也分为两种,分别是停留在浏览器所占内容的临时性的cookie,在页面窗口关闭之后就被删除,被称为session cookie;而另外一种是通过存放在硬盘空间中长期存在的cookie,这种cookie称为persistent cookie,也就是我们通常意义上所讲的cookie。

通常session是依赖于session cookie来与客户端交互的,当然session的工作方式不仅仅限于这一种,还有其他的方式在下文会说到。

cookie的属性

以下表格是cookie的比较常用的属性及其说明:

 

属性名 描述
String name 该Cookie的名称。Cookie一旦创建,名称便不可更改
Object value 该Cookie的值。如果值为Unicode字符,需要为字符编码。如果值为二进制数据,则需要使用BASE64编码
int maxAge 该Cookie失效的时间,单位秒。如果为正数,则该Cookie在maxAge秒之后失效。如果为负数,该Cookie为临时Cookie,关闭浏览器即失效,浏览器也不会以任何形式保存该Cookie。如果为0,表示删除该Cookie。默认为–1
boolean secur 该Cookie是否仅被使用安全协议传输。安全协议。安全协议有HTTPS,SSL等,在网络上传输数据之前先将数据加密。默认为false
String path 该Cookie的使用路径。如果设置为“/sessionWeb/”,则只有contextPath为“/sessionWeb”的程序可以访问该Cookie。如果设置为“/”,则本域名下contextPath都可以访问该Cookie。注意最后一个字符必须为“/”
String domain 可以访问该Cookie的域名。如果设置为“.google.com”,则所有以“google.com”结尾的域名都可以访问该Cookie。注意第一个字符必须为“.”

要注意到cookie的名称是无法修改的,同时cookie并不提供修改和删除的操作,如果说要修改cookie 的内容,则可以新建一个同名的cookie覆盖掉原来的即可;要删除cookie的话则新建一个同名的cookie,并设置其maxAge为0即可。

需要考虑cookie中maxAge的一些特殊值所代表的含义,如果maxAge为负值,则表示cookie仅仅在当前浏览器窗口以及其打开的子窗口中有效,关闭时则失效,这也是cookie的默认maxAge值;如果maxAge为0,则说明删除该cookie,由于并没有删除cookie的操作,这里是需要通过cookie的maxAge来进行删除操作的。

seesion的出现

对于cookie是存储在客户端的,这种存储在客户端的信息往往是不安全的,所以后来又有了session,客户端浏览器向服务器发送请求的时候,服务器将客户端的信息以某种形式存储在服务器上,这种存储在服务器端的信息在客户第二次访问服务器的时候被使用,用来确定用户的状态等信息。打个比方而言,就相当于这是一张记录客户信息的表格,客户只要表明身份,服务器就能从这个表格中来获取客户的信息,根据信息进行服务。

session的使用

服务器会在客户端第一次请求服务的时候创建session对象,与cookie类似,session对象也是以键值对的形式存储的。每个session对象都有独立的session_id,对于特定的客户,就赋予特定的session,可以区分不同的用户。需要注意的是,通常是在用户请求具体服务的时候才会创建session,单纯的访问静态的内容(如HTML)并不会创建session。而在创建之后的每一次客户访问服务器都会更新session的内容,比如session的最后访问时间等等

还有一点是session的内容应该尽量的精简,因为session是存储在服务器端的,需要占用到宝贵的服务器资源(一般放在服务器内存里),所以这里在有大量客户访问的时候,会导致服务器的资源不够用。此外还会给session设置有效期,对于长时间没有活跃的session会从内存中删除,这也是我们用一些Web应用时会有说“登录超时”的情况出现。

session的依赖实现

对于上面所说的session,它对于用户来说是透明的,在客户请求服务的时候,客户端需要有一个标示自己身份的凭证,但是仅仅是标示自己的身份,所以这个标示会比较小。通过这个身份,服务器才能从内存中的多个session中知道用户是对应于哪一个session。

一般来说session是要依赖于cookie来实现,这一点在上面讲到cookie的分类时说到,这时候生成的cookie就是上文提到的session cookie,而cookie的内容就是session的特定的id,这个cookie在浏览器关闭的时候就会失效。

因此同一个机器上的两个浏览器窗口访问服务器的时候会生成两个不同的session。但是如果两个窗口是由同一个父窗口打开的话,子窗口会共享父窗口的cookie,所以这时候是共享一个session。

如果禁用了cookie,那要怎么实现session?

这个问题有时候会在面试的时候问到,在浏览器禁用cookie或者不支持cookie的时候,通常会采取一种叫做“URL重写”的方式来实现session,也就是以类似于GET方式,将session_id写在URL的后面,这样服务器也能获取到客户的session_id,通过这个独立的id就能识别特定的用户了。

Cookie和Session的应用场景

Cookies的安全性能一直是倍受争议的。虽然Cookies是保存在本机上的,但是其信息的完全可见性且易于本地编辑性,往往可以引起很多的安全问题。所以Cookies到底该不该用,到底该怎样用,就有了一个需要给定的底线。

【1】session

登陆验证信息。一般采用Session(“Logon”)=true or false的形式。 用户的各种私人信息,比如姓名等,某种情况下,需要保存在Session里 需要在页面间传递 的内容信息,比如调查工作需要分好几步。每一步的信息都保存在Session里,最后在统一更 新到数据库

【2】cookie

判断用户是否登陆过网站,以便下次登录时能够直接登录。如果我们删除cookie,则每次登 录必须从新填写登录的相关信息。 另一个重要的应用是“购物车”中类的处理和设计。用户可能在一段时间内在同一家网站的不同 页面选择不同的商品,可以将这些信息都写入cookie,在最后付款时从cookie中提取这些信 息,当然这里面有了安全和性能问题需要我们考虑了。

使用cookie应遵循的原则

(1)不要保存私人信息。
(2)任何重要数据,最好通过加密形式来保存数据(最简单的可以用URLEncode,当然也可以用完善的可逆加密方式,遗憾的是,最好不要用md5来加密)。
(3)是否保存登陆信息,需有用户自行选择。
(4)长于10K的数据,不要用到Cookies。
(5)也不要用Cookies来玩点让客户惊喜的小游戏。

总结

1 、Session采用键值对 , 也就是说ID存放客户端 , 而值放在服务器端 , 是通过用户的ID去找服务器上对应的值 , 这种方式值放置在服务器端 ,有个时间限制 ,时间到则服务器自动释放.
2 、Cookies则有两种方法 , 一种方法是把值保存在浏览器的变量中 , 当浏览器关闭时结束 , 另一种方法是保存在硬盘中 , 只要时间不过期 , 下次还可使用.
3 、Session 是由应用服务器维持的一个服务器端的存储空间,用户在连接服务器时,会由服务器生成一个唯一的SessionID,用该SessionID 为标识符来存取服务器端的Session存储空间。而SessionID这一数据则是保存到客户端,用Cookie保存的,用户提交页面时,会将这一 SessionID提交到服务器端,来存取Session数据。这一过程,是不用开发人员干预的。所以一旦客户端禁用Cookie,那么Session也 会失效。
4 、服务器也可以通过URL重写的方式来传递SessionID的值,因此不是完全依赖Cookie。如果客户端Cookie禁用,则服务器可以自动通过重写URL的方式来保存Session的值,并且这个过程对程序员透明。
5 、可以试一下,即使不写Cookie,在使用request.getCookies();取出的Cookie数组的长度也是1,而这个Cookie的名字就是JSESSIONID,还有一个很长的二进制的字符串,是SessionID的值。


文章 Cookie、session的联系和区别,以及应用场景 转载需要注明出处
喜欢 (0)

您必须 登录 才能发表评论!