我记得我面试过几家公司,大部分多多少少会问及Cookie和Session,有的会稍微问一下,有的就会着重,主要看面试官的意向,于是,我便去查询资料以及网上我认为特别好的回答,记录下这个,以便以后跳槽作为复习资料来看。(本文只代表我自己的看法,如有不合理之处,望忽略。)
首先我们需要了解会话技术的概念
什么是会话?
会话是浏览器和服务器之间的多次请求和响应,为了实现某一个功能(比如买东西),浏览器和服务器之间可能会产生多次的请求和响应,从浏览器访问服务器开始,到访问服务器结束,浏览器关闭为止,这期间产生的多次请求和响应加在一起就称之为浏览器和服务器之间的一次会话。
产出物:
每个用户在使用浏览器与服务器进行会话的过程中,不可避免各自会产生一些数据,程序要想办法为每个用户保存这些数据
需要解决的问题:
如何保存会话中产生的数据?
在一次会话中往往会产生一些数据,可以通过会话技术(Session和Cookie)保存会话中产生的数据。
所以,到这里;便知道了Cookie和Session是保存会话数据的两种技术。
Cookie会话技术
Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了(Cookie翻译成中文是小甜点,小饼干的意思。在HTTP中它表示服务器送给客户端浏览器的小甜点。其实Cookie就是一个键和一个值构成的,随着服务器端的响应发送给客户端浏览器。然后客户端浏览器会把Cookie保存起来,当下一次再访问服务器时把Cookie再发送给服务器。)。
Session会话技术
Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到session对象。
session工作原理
浏览器访问web服务器,web服务器访问servlet后,当第一次访问session时,就自动创建此浏览器独享的session,此session是由key-value组成,key是String,value是object。
当request访问servlet1时,建立此浏览器对应的session,并为此session分配session id,response时在cookie中回一个JSESSIONID(set-cookie中),当此浏览器再次发送http请求时,会在cookie中顺带session id,服务器根据id号寻找与之匹配的session。
session失效
1)客户端的请求中没有sessionId。可能是因为这是第一次请求(开始一个新的会话),也可能是服务器设置Cookie的maxAge为0导致的;(客户端没有银行卡)
2)客户端请求中存在sessionId,但这个sessionId在session池中没有匹配的session对象。这可能是因为session太久没有使用,服务器把session从池中移除的原因;(银行卡没有对应的银行账户)
3)客户端请求中存在sessionId,但匹配的session对象被标记为失效!这可能是因为服务器调用了session.invalidate()方法导致的。(银行账户找到了,但账户已被冻结)
4)服务器正常关闭,session会被序列化到磁盘上面,下次在使用的时候会在反序列化回来
总结:
Session和Cookie的主要区别在于:
都是用来跟踪浏览器用户身份的会话方式
1)Cookie是把用户的数据写给用户的浏览器,数据保存在客户端;Session技术把用户的数据写到用户独占的session中(服务器端),数据保存在服务器端。
2)Cookie不是很安全,别人可以分析存在本地的Cookie,并进行Cookie欺骗,如果需要考虑安全,则使用Session;
3)Session会在一定时间内保存在服务器上,当访问增多,会笔尖占用你的服务器的性能,如果主要考虑减轻服务器性能方面,应当使用Cookie
4)Cookie有大小和个数的限制。