源码先锋

源码先锋

理解Cookie和Session的区别及使用

admin 38 160

前言

HTTP是一种无状态的协议,为了分辨链接是谁发起的,需自己去解决这个问题。不然有些情况下即使是同一个网站每打开一个页面也都要登录一下。而Session和Cookie就是为解决这个问题而提出来的两个机制。

应用场景

登录网站,今输入用户名密码登录了,第二天再打开很多情况下就直接打开了。这个时候用到的一个机制就是cookie。

session一个场景是购物车,添加了商品之后客户端处可以知道添加了哪些商品,而服务器端如何判别呢,所以也需要存储一些信息就用到了session。

1.Cookie

通俗讲,是访问某些网站后在本地存储的一些网站相关信息,下次访问时减少一些步骤。更准确的说法是:Cookies是服务器在本地机器上存储的小段文本并随每一个请求发送至同一服务器,是在客户端保持状态的方案。

Cookie的主要内容包括:名字,值,过期时间,路径和域。使用Fiddler抓包就可以看见,比方说我们打开百度的某个网站可以看到Headers包括Cookie,如下:

key,value形式。过期时间可设置的,如不设,则浏览器关掉就消失了,存储在内存当中,否则就按设置的时间来存储在硬盘上的,过期后自动清除,比方说开关机关闭再打开浏览器后他都会还存在,前者称之为Sessioncookie又叫transientcookie,后者称之为Persistentcookie又叫permenentcookie。路径和域就是对应的域名,a网站的cookie自然不能给b用。

2.Session

存在服务器的一种用来存放用户数据的类HashTable结构。

浏览器第一次发送请求时,服务器自动生成了一HashTable和一SessionID来唯一标识这个HashTable,并将其通过响应发送到浏览器。浏览器第二次发送请求会将前一次服务器响应中的SessionID放在请求中一并发送到服务器上,服务器从请求中提取出SessionID,并和保存的所有SessionID进行对比,找到这个用户对应的HashTable。

一般这个值会有个时间限制,超时后毁掉这个值,默认30分钟。

当用户在应用程序的Web页间跳转时,存储在Session对象中的变量不会丢失而是在整个用户会话中一直存在下去。

Session的实现方式和Cookie有一定关系。建立一个连接就生成一个sessionid,打开几个页面就好几个了,这里就用到了Cookie,把sessionid存在Cookie中,每次访问的时候将Sessionid带过去就可以识别了.

区别

存储数据量方面:session能够存储任意的java对象,cookie只能存储String类型的对象

一个在客户端一个在服务端。因Cookie在客户端所以可以编辑伪造,不是十分安全。

Session过多时会消耗服务器资源,大型网站会有专门Session服务器,Cookie存在客户端没问题。

域的支持范围不一样,比方说的Cookie在下都能用,而的Session在下都不能用,解决这个问题的办法是JSONP或者跨域资源共享。

session多服务器间共享

服务器实现的session复制或session共享,如webSphere或JBOSS在搭集群时配置实现session复制或session共享.致命缺点:不好扩展和移植。

利用成熟技术做session复制,如12306使用的gemfire,如常见内存数据库redis或memorycache,虽较普适但依赖第三方.

将session维护在客户端,利用cookie,但客户端存在风险数据不安全,且可以存放的数据量较小,所以将session维护在客户端还要对session中的信息加密。

第二种方案和第三种方案的合体,可用gemfire实现session复制共享,还可将session维护在redis中实现session共享,同时可将session维护在客户端的cookie中,但前提是数据要加密。

这三种方式可迅速切换,而不影响应用正常执行。在实践中,首选gemfire或者redis作为session共享的载体,一旦session不稳定出现问题的时候,可以紧急切换cookie维护session作为备用,不影响应用提供服务

单点登录中,cookie被禁用了怎么办?(一点登陆,子网站其他系统不用再登陆)

单点登录的原理是后端生成一个sessionID,设置到cookie,后面所有请求浏览器都会带上cookie,然后服务端从cookie获取sessionID,查询到用户信息。

所以,保持登录的关键不是cookie,而是通过cookie保存和传输的sessionID,本质是能获取用户信息的数据。

除了cookie,还常用HTTP请求头来传输。但这个请求头浏览器不会像cookie一样自动携带,需手工处理