一、 Cookie和Session
场景:用户通过浏览器访问 Web 应用时,服务器都需要保存和跟踪用户的状态。
cookie:客户端会话技术;
原理流程:
cookie客户端访问服务端,服务端响应给客户端的携带一段文本信息放在相应报文头中,可以看成是cookie对象,然后客户端进行保存的一段用户访问信息文本。
如果浏览器保存在内存中,则称为会话级(默认)的cookie,退出浏览器就删除销毁了;
如果把浏览器将这段信息(cookie对象)保存在硬盘中,则称为持久性cookie,可以设置有效时间(是cookie的一个属性字段);
如果浏览器再次请求服务器,则把这cookie放在http请求头中一同发给服务器,服务器就好跟踪辨别了;
创建获取:
1、javax.servlet.http.Cookie
里面含有方法,获取各种消息
2、HttpServletResponse 接口和 HttpServletRequest 接口也都定义了与 Cookie 相关的方法,Cookie[] getCookies() 用于获取客户端提交的 Cookie对象。
缺点:
1、cookie是明文传递,不安全;
2、客户端保存的cookie的数量和长度是有限制的;
3、cookie是把对象信息编译成字符串进行保存;
session:服务器端会话技术;
原理流程:
1、当客户端第一次请求会话对象时,服务器会创建一个 Session 对象,并为该 Session 对象分配一个唯一的 SessionID(用来标识这个 Session 对象)
2、服务器将 SessionID 封装在cookie中以 Cookie(Cookie 名称为:“JSESSIONID”,值为 SessionID 的值)的形式发送给客户端浏览器;
3、客户端浏览器再次发送 HTTP 请求时,会将携带 SessionID 的 Cookie 随请求一起发送给服务器;
4、服务器从请求中读取 SessionID,然后根据 SessionID 找到对应的 Session 对象。
5、同一浏览器的不同窗口共享同一 Session 对象,但不同浏览器窗口之间不能共享 Session 对象
创建获取方式:
1、HttpServletRequest.getSession() 方法可以获得 HttpSession 对象;
方法参见:http://c.biancheng.net/servlet2/session.html
Session 对象在服务器中驻留一段时间后没有被使用,就会被销毁,这个时间就是 Session 的过期时间。
2、 javax.servlet.http.HttpSession 接口
设置Session失效时间
1、在web.xml中使用 <session-config><session-timeout>10</session-timeout></session-config>元素; 单位分钟,tomcat中session有效期默认20分钟;0或者负数表示永久有效
2、调用session对象的setMaxInactiveInterval(int arg);参数为正数表示秒 0或者负数表示永久有效
优先级:2>1
销毁方式:
Session 对象在如下 3 种情况下会被销毁:
1)Session 过期;
2)调用 session.invalidate() 方法,手动销毁 Session;
3)服务器关闭或者应用被卸载。
注:值得注意的是,当客户端访问的 Web 静态资源 HTML,CSS,图片等静态资源时,服务器不会创建 Session 对象,cookie和session是你访问jsp和servlet的时候才创建,
Session 与 Cookie 对比
Session 和 Cookie 都属于会话技术,都能帮助服务器保存和跟踪用户状态,但两者也存在差异,如下表。
不同点 Cookie Session
存储位置不同 Cookie 将数据存放在客户端浏览器内存中或硬盘上。 Session 将数据存储在服务器端。
大小和数量限制不同 浏览器对 Cookie 的大小和数量有限制。 Session 的大小和数量一般不受限制。
存放数据类型不同 Cookie 中保存的是字符串。 Session 中保存的是对象。
安全性不同 Cookie 明文传递,安全性低,。 Session 存在服务器端,安全性较高。
对服务器造成的压力不同 Cookie 保存在客户端,不占用服务器资源。 Session 保存在服务端,每一个用户独占一个 Session。若并发访问的用户十分多,就会占用大量服务端资源。
跨域支持上不同 Cookie 支持跨域名访问。 Session 不支持跨域名访问。
二、 关于session和Cookie作用域的理解:
“5、同一浏览器的不同窗口共享同一 Session 对象,但不同浏览器窗口之间不能共享 Session 对象”
session和cookie都是服务端创建,但保存位置及其他不同,因为是服务端出创建,所以上面的第5条是相对于请求的同一服务端来说的比如你访问淘宝,那么同一浏览器可能就会创建一个session对象保存身份信息,登录信息,用户状态这时你想对比一下京东上面的商品,当你访问京东时就算是同一浏览器,京东服务端也肯定会创建一个session保存关于用这个浏览器登录京东服务的用户登录相关信息;
三、后话
文中所写不符合逻辑或者不严谨之处,恳望007们海涵;本着知其然,知其所以然的态度,诚请007们留言指正,以免误导他人,若仍未解决大家的问题,望去他处拜询后,回来留言补充