转自:http://www.cnblogs.com/s1nker/p/4876284.html
基本概念
对于许多人来说,都知道的是,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机制详解 作者:fangaoxin
老生常谈session,cookie的区别,安全性 作者:海底苍鹰