为什么使用session和cookie
http是无状态协议,意味着如果后续处理需要前面的信息,则必须重传,这样那么每次传送的数据量会增大。为了解决大量重复信息内容的问题,cookie和session就登场了,它们可以保存用户的状态。
cookie
cookie通过客户端保持状态的解决方案。从定义上说,cookie就是服务器发送给客户端的特殊信息,而这些信息以文本的方式存放在客户端,然后客户端每次向服务器发送请求时都会带上这些特殊的信息。
当用户浏览器访问一个支持cookie的网站时:
1.用户提供包括用户名在内的个人信息提交至服务器。
2.服务器在向客户端回传相应的超文本的同时,发回这些个人信息。放在http相应头中。
3.当客户端浏览器收到来自服务器的响应后,浏览器会把这些信息放在一个统一的位置。
4.之后客户端再向服务器发送请求时,会把相应的cookie再次返回服务器,而这次,cookie信息放在htt请求头中。
简单解释一下这张表格:
1、NAME=VALUE,键值对,cookie包括session都是以键值对的形式存储的
2、Domain,指的是生成该Cookie的域名
3、Path,指的是该Cookie是在哪个路径下生成的
4、Expires / Max-Age,指的是该Cookie的过期时间/最大失效时间(即多少秒之后失效)
5、Size,这个很明显,指的是占用的字节大小
6、Secure,如果设置了这个属性,那么只会在SSH连接时才会回传该cookie
有了cookie这样的技术实现,服务器在接收到来自客户端浏览器的请求之后,就能够通过分析存放于请求头中的cookie信息得到来自客户端特有的信息,从而动态生成与客户端相对应的内容。
session
session是相对cookie的另一个解决方案,是通过服务器来保持状态的。session指的是服务器为客户端所开辟的存储空间,在其中保存的信息就是用于保存状态的。
session是服务器端程序运行中创建的,不同语言实现的应用程序有不同创建session的方法,在创建session的同时,会生成一个唯一的sessionId,而这个sessionId被创建后,可以调用session相关的方法往session中增加内容。而这些信息只保存在服务器中,
发送给客户端只有sessionId。客户端再次发送请求时会把sessionId带上,服务器收到请求后会根据sessionId找到对应的session,从而保持状态。
sessionId存放有两种方式:
1.通过url存取,url会带上一个sessionId=xxx,这样每次请求都穿了sessionId给服务器。
2.通过cookie存取(tomcat默认),这种cookie是session cookie,是区别我们常用的cookie(常用的cookie也叫作persistent cookie),session cookie是存储在浏览器内存中(至于浏览器内存在哪,这个与浏览器相关,比如360浏览器,就这360se6User DataDefault路径下)而不是在
硬盘。程序一开始执行,服务器就生成一个sessionId并通过cookie携带到客户端的缓存中,下次访问时,服务器会先检测一下是否有这个cookie,如果有就叫取它的id,如果没有就再生成一个。这就是为什么浏览器关闭后,再进去session没有了,其实在服务器session没有清空,只是传过去没有sessionId,浏览器为这次会话生成了新的sessionId和session,不是原来的session了。服务器保存的session数据不是立即释放的,此时数据还会存在,只要我们知道那个sessionId,就可以访问到原来的session。服务端自动对session进行管理,如果在规定的时间内没有访问,就会释放掉session。
还有:
1.sessionId通常是看不见的,但是当我们把浏览器cookie禁止之后,web服务器会采用url重写的方式传递sessionId,这样就可以在地址栏看到了。
2.session cookie不可以跨窗口使用。
session和cookie
单独使用cookie和session都是不安全的
cookie缺点:
1.使用cookie来传递信息,随着cookie个数的增多和访问量的增加,它占用的网络宽带也很大。
2.cookie不安全,因为cookie是放在客户端的,所有可以通过插件修改cookie。所以从这个角度说该用session,session是将数据保存在服务端,只是传递一个sessionId而已,session更适合存储用户隐私和重要数据。
session缺点:
1.不容易在多台服务器共享(致命弱点)。
2.session太多会消耗服务器性能。