session:存放在服务器端记录用户登录状态的一次会话,例如你从浏览器打开一个网页开始,到关闭浏览器的这个过程,就是一次会话。
cookie:网站为了辨别标识用户身份,进行session跟踪,而存储在用户本地终端上的数据。
为何要进行session跟踪??
首先了解http协议的无状态性,无状态的含义:http协议是应用层的协议建立在tcp协议的基础上,一次http通信会建立一个tcp连接。而无状态就是一次通信建立连接,得到响应,就关闭。你接下来继续请求时,服务器端没有记录你的任何数据。
例如:你登录一个网站,登录发送一次http请求,建立tcp连接,响应登陆成功(进入主页),tcp连接关闭。接下来你想查看我的信息,结果服务器没记录你的任何信息,这样,就进行不下去。
如何解决一个无状态的协议关联两次连续的请求,保持http连接??
引入了一种session跟踪技术(1.配合cookie使用。2.url重写)
<1>配合cookie使用。
1、用户第一次发送http请求(用户登录等),服务器建立session会话,创建session信息,并记录下来,创建一个session的·唯一标识。响应请求,并将这唯一标识写入响应:
Set-cookie:name=name;expires=date;
sessionid=sessionid;path=path;domain=domain;
2、浏览器解析响应,得到sessionid,并将其写入本地cookie中,接下来,用户继续发送请求,并将cookie(里面有sessionid)发送给服务器,服务器获得sessionid,根据sessionid就可查看其服务器端保存的那个用户的具体session信息。
<2>url重写,就是每次请求都在url末尾附上jsessionid=xxx这样,每次请求的时候就能获得sessinid,然后再根据sessionid判断是否已存在该session(存在,与request绑定),不存在,创建。
注意:无论哪种方式,浏览器每次发送请求时,都要讲sessionid发送给服务器。
例子:
Servlet/jsp容器在封装HttpServletRequest对象时根据cookie或者url中是否存在sessionid来决定是绑定当前的session到HttpRequest还是创建新的session对象(在请求解析阶段发现并记录sessionid,在Request对象创建阶段将session绑定);
对于一个高访问量的网站,多个用户建立太多session影响系统性能的处理。
1.设置session超时。(session.invalidate())
2.将session写入服务器端的本地磁盘。
3.
session与cookie的应用。
1. 应用场景
Cookie的典型应用场景是Remember Me服务,即用户的账户信息通过cookie的形式保存在客户端,当用户再次请求匹配的URL的时候,账户信息会被传送到服务端,交由相应的程序完成自动登录等功能。当然也可以保存一些客户端信息,比如页面布局以及搜索历史等等。
Session的典型应用场景是用户登录某网站之后,将其登录信息放入session,在以后的每次请求中查询相应的登录信息以确保该用户合法。当然还是有购物车等等经典场景;
2. 安全性
cookie将信息保存在客户端,如果不进行加密的话,无疑会暴露一些隐私信息,安全性很差,一般情况下敏感信息是经过加密后存储在cookie中,但很容易就会被窃取。而session只会将信息存储在服务端,如果存储在文件或数据库中,也有被窃取的可能,只是可能性比cookie小了太多。
Session安全性方面比较突出的是存在会话劫持的问题,这是一种安全威胁,这在下文会进行更详细的说明。总体来讲,session的安全性要高于cookie;
3. 性能
Cookie存储在客户端,消耗的是客户端的I/O和内存,而session存储在服务端,消耗的是服务端的资源。但是session对服务器造成的压力比较集中,而cookie很好地分散了资源消耗,就这点来说,cookie是要优于session的;
4. 时效性
Cookie可以通过设置有效期使其较长时间内存在于客户端,而session一般只有比较短的有效期(用户主动销毁session或关闭浏览器后引发超时);
5. 其他
Cookie的处理在开发中没有session方便。而且cookie在客户端是有数量和大小的限制的,而session的大小却只以硬件为限制,能存储的数据无疑大了太多。