Cookie、Session
什么是会话?
浏览器在申请拜访服务器开始,始终到拜访浏览器完结,浏览器敞开为止,这期间浏览器和服务器之间产生的所有申请和响应加在一起,就称为浏览器和服务器之间的一次会话。在一次会话中往往会产生一些数据,而这些数据须要咱们保存起来,例:* 比方在没有登录时,将商品记录到购物车,其实就是将商品信息存入到了 coocie 或者 session 中。
能够用 cookie 或者 session 保留会话中产生的数据
Cookie 的工作原理
1:Cookie 是将会话中产生的数据保留在客户端,属于客户端技术;
2:Cookie 是基于两个头进行工作的:Set-Cookie 响应头和 Cookie 申请头;
3:通过 Set-Cookie 响应头将 Cookie 从服务器发送到浏览器,让浏览器保留到外部;而浏览器一旦保留了 Cookie,当前浏览器每次拜访服务器时,都会通过 Cookie 申请头,将 Cookie 信息带回到服务器中。在须要时,在服务器端能够获取申请中 Cookie 的数据,从而实现一些性能;
Cookie 中 API 的利用
1. 创立 Cookie 对象
Cookie cookie = new Cookie(String name,Stringvalue);// 创立 cookie 的同时须要指定 cookie 的名字和 cookie 要保留的值
// Cookie 的名字一旦指定后,就无奈批改!
2. 将 Cookie 增加到 response 响应中
response.addCookie(Cookie cookie);
// 将 cookie 增加到响应中,由服务器负责将 cookie 信息发送给浏览器,再由浏览器保留到外部(能够屡次调用该办法,增加一个以上的 cookie
3. 获取申请中的所有 Cookie 对象组成的数组
Cookie[] cookie = request.getCookies();
// 获取申请中携带的所有 cookie 组成的 cookie 对象数组,如果申请中没有携带任何 cookie,调用该办法会返回 null。
4. 删除浏览器中的 Cookie
// cookie 的 API 中没有提供间接删除 cookie 的办法,能够通过别的形式间接删除 cookie
// 删除名称为 cart 的 cookie:能够向浏览器再发送一个同名的 cookie(即名称也叫做 cart),并设置 cookie 的最大生存工夫为零,因为浏览器是依据 cookie 的名字来辨别 cookie,如果前后两次向浏览器发送同名的 cookie,后发送的 cookie 会笼罩之前发送的 cookie。而后发送的 cookie 设置了生存工夫为零,因而浏览器收到后也会立刻删除!
5.Cookie 的罕用办法:
cookie.getName(); // 获取 cookie 的名字
cookie.getValue(); // 获取 cookie 中保留的值
cookie.setValue(); // 设置 / 批改 cookie 中保留的值(没有 setName 办法, 因为 cookie 的名字无奈批改)
cookie.setMaxAge(); // 设置 cookie 的最大生存工夫(如果不设置,cookie 默认在一次会话完结时销毁!)
6. 设置 Cookie 最大的生存工夫(SetMaxAge):
cookie。setMaxAge(60) // 单位为秒
示例:
Session 原理及利用
Session 的工作原理
1:Session 是将会话中的产生的数据保留在服务器端,属于服务器端技术;
2:Session 是一个域对象,Seesion 中也保留了一个 map 汇合,往 Session 中存数据,其实就是将数据保留到 Session 指定 map 汇合中;
3:通过 session.setAttribute()办法,能够将数据存入到 Session 中,通过 session.getAttribute()办法能够将数据从 session 中取出来;
Session 是一个域对象
获取 session 对象:
request.getSession()
// 获取一个 Session 对象,如果在服务器外部中由以后浏览器对应的 session,则间接返回该 session 对象;如果没有对应的 session,则会先创立一个新的 session 对象再返回;
Session 是一个域对象,在 session 中也保留了一个 map 汇合,并且 sess 中也提供了存取数据的办法,如下:
session.setAttribute(String attrName,Object attrValue);
// 往 session 域中增加一个域属性,属性名必须为字符串类型,属性值能够为任意类型
session。setAttribute(String attrName);
// 依据属性名能够获取域中的属性值,返回值是一个 Object 类型
Session 域对象的三大个性:
(1)生命周期:
创立 session:
第一次调用 request.getSession()办法时,会创立一个 session 对象。(当浏览器在服务器端没有对应的 session 时,调用 request.getSession()办法,服务器会创立一个 session 对象)
销毁 session:
1. 超时销毁 :
默认状况下,当超过 30 分钟没有拜访 session 时,session 就会超时销毁(30 分钟是默认工夫,能够批改);
2. 他杀:
调用 session 的 invalidate 办法时,会立刻销毁 session;
3. 意外身亡:
1)当服务器非正常敞开时(硬件损坏,断电,内存溢出等导致服务器非正常敞开),session 会随着服务器的敞开而销毁;
2)当服务器失常敞开,在敞开之前,服务器会将外部的 session 对象序列化保留到服务器的 work 目录下,变为一个文件。这个过程叫做 session 的钝化(序列化);再次将服务器启动起来,钝化着的 session 会再次回到服务器,变为服务中的对象,这个过程叫做 session 的活化(反序列化);
(2)作用范畴:
在一次会话范畴内(获取到的都是同一个 session 对象)
(3)次要性能:
在整个会话范畴内实现数据的共享
总结 两者的区别
Cookie 和 Session 都属于会话技术,都能够保留会话中产生的数据,然而因为 Cookie 和 Session 的工作原理和特点不同,多以两者的利用场景也不同。
Cookie 的特点:
1.Cookie 是将会话中产生的数据存入到 浏览器客户端,属于客户端技术(JS 能够拜访 cookie)
2.Cookie 是将数据保留到浏览器客户端,容易随着用户的操作导致 cookie 失落或被窃取,因而 cookie 中保留的数据不太稳固,也不太平安
3.cookie 中数据存在浏览器中,对服务器端没有太大影响,能够将数据保留很长时间
4. 浏览器对 cookie 的大小和个数都有限度,个别每个站点给浏览器发送的 cookie 不超过 20 个,每个 cookie 大小不超过 1KB
总结:cookie 中适宜存须要长时间保留的,对安全性要求不高的数据;
Session 的特点:
1.Session 是将会话产生的内容存入到服务器端,属于服务器端技术
2.session 将数据存入到服务器端的 session 对象中,相对来说更加平安,稳固。不容易随着用户的操作而导致 session 中数据失落
3.session 是服务器端的对象,在并发量较高的时候,每一个浏览器客户端在服务端都要对应一个 session 对象,占用服务器的内存空间,影响效率
总结:session 中适宜存储对安全性要求较高,但不须要长时间保留的数据;
留神:cookie 中保留中文数据的问题,Tomcat8.5 及 8.5 当前的版本中曾经解决了该问题!
留神:获取不到之前的 session 的问题
将商品保留到 session 中后,敞开浏览器再关上浏览器,拜访服务器,此时获取不到之前的 session。因为 session 是基于 Cookie 工作的。
在服务器创立一个 session 后,会为 session 调配一个举世无双的编号,称之为 session 的 id,在此次响应时,服务器会将 session 的 id 以一个名称为 JSESSIONID 的 cookie 发送给浏览器保留到浏览器外部。
因为保留 sessionid 的 cookie 默认是会话级别的 cookie,在浏览器敞开后,cookie 会跟着销毁,sessionid 也失落了。因而下次访问服务器,没有 session 的 id 就获取不到之前的 session。也获取不到 session 中的商品信息
解决办法:咱们能够创立一个名称为 JSESSIONID 的 cookie,其中保留 session 的 ID,并设置 cookie 的最大存活工夫,让 cookie 保留到硬盘上(即便浏览器敞开,cookie 也不会销毁),这样下次访问服务器时,还能够将 sessionid 带给服务器,服务器能够通过 sessionid 获取到之前的 session。从 session 中获取到商品信息