Note:由于刚从C#桌面开发转行到Java Web。所以如果小弟理解有错误的地方,希望大神们能够不吝赐教,也帮助小弟提高。先谢谢伟大的博友。
前几天看公司的项目代码,发现项目中有好多地方用到通过Request获取Session和Cookie的代码,此刻的我只是知道Session和Cookie是用来村数据的东西。具体Session和Cookie之间的区别和联系还不知道。正好晚上和朋友吃饭的时候,有个朋友问我知不知道Session和Cookie的区别,也是含糊的回答了一些。
今天查了一些资料,由于篇幅太大,个人对看到的资料总结如下,希望对大家有所帮助,如果有不正确的地方,请博友指出,我会及时更新。
session对Cookie的依赖、相互作用流程
Session对Cookie的依赖:Cookie采用客户端存储,Session采用的服务端存储的机制。Session是针对每个用户(浏览器端)的,Session值保存在服务器上,通过SessionId来区分哪个用户的Session。因此SessionId需要被绑定在浏览器端。SessionId通常会默认通过Cookie在浏览器端绑定,当浏览器端禁用cookie时,可通过Url重写(可以在地址栏看到sessionid=KWJHUG6JJM65HS2K6之类的字符串)或者表单隐藏字段的方式将SessionId传回给服务器,以便服务通过SessionId获取客户端对应的Session。
具体一次的请求流程:当程序需要为客户端创建一个Session的时候,服务器首先检测这个客户端请求里面是否已经包含了Session的表示(SessionId),如果已经包含,则说明已经为客户端创建过一个Session,服务端根据SessionId检索出来Sesion并使用。如果客户端请求不包含SessionId,则为客户端创建一个Session,并生成一个SessionId返回给客户端保存。
Session与Cookie特性的总结
- cookie存储在客户端、session存储在服务器端。
- session依赖于cookie(原因:客户端与服务器之间保持状态的解决方案,sessionID存储在浏览器端的cookie里,当浏览器发送请求的时候,服务器用一个sessionID来区分是哪个用户session变量,要不然服务器怎么知道是那个用户发过来的请求呢)。
- session一直存储在服务器内存中。当浏览器不变时请求的是同一个Session。当浏览器关闭时候,再打开session就会发生变化(“只要关闭浏览器,session就消失了”),原因:其实关闭浏览器前的session并没有消失,只是在关闭浏览器的时候seesionId消失了,再次打开浏览器时无法找到原来的session了,如果把原来的sessionId再发服务器,还是能找到原来的Session。
- cookie 当设置cookie不设置生命周期时,保存在内存中,当关闭浏览器时cookie被清空。当设置生命周期时候,cookie被保存在硬盘中,所以当关闭浏览器,再打开还是可以访问到,知道生命周期结束。
- sessionId 默认(通过Cookie)存储在浏览器的内存中,所以关闭浏览器,sessionId会消失。
- 当浏览器禁用cookie时,通过URL重写,就是把session id直接附加在URL路径的后面。还有一种技术叫做表单隐藏字段等技术重新将Session提交给服务器。
- 保存在硬盘中的cookie,可能能会遭到cookie欺骗以及针对cookie的跨站脚本攻击。
- 可以把sessionid保存在persistent cookie中,实现了跨窗口的session tracking(会话跟踪)
- cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session。
-
session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用COOKIE。
-
单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
-
Session默认生命名周期,我看到一些人说20分钟,一些人说30分钟。这个应该和服务配置有关。tomcat默认是30分钟。tomcat配置参数如下
<!-- ==================== Default Session Configuration ================= --> <!-- You can set the default session timeout (in minutes) for all newly --> <!-- created sessions by modifying the value below. --> <session-config> <session-timeout>30</session-timeout> </session-config>