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中获取到商品信息