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中获取到商品信息
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。