一、什么是Cookie?以及Cookie的简单的应用?
- Cookie是一种客户端状态管理技术: cookie由客户端创建,由浏览器保存
应用场景: 1. 记住用户名和密码 2.商品的浏览记录
二、Cookie的工作原理?如何创建Cookie对象?如何响应给浏览器?
- 浏览器第一次访问服务器;
- 在服务器端创建Cookie对象并相应给浏览器(会被浏览器保存在浏览器端)
Cookie c1=new Cookie(key,value); //创建cookie对象 response.addCookie(c1); //添加cookie到response中,最后会相应给浏览器 c1.setMaxAge(参数); //正数:存货多少秒;0:立即删除;-1:浏览器关闭时删除
- 浏览器非第一访问服务器;会携带所有保存过的本网站所有的cookie对象到服务器;服务器接收cookie对象;
Cookie[] cs=request.getCookies(); //获取所有的cookie对象 if(cs!=null){ //当cs不为空的时候遍历数组 for(Cookie c: cs){ //遍历cookie数组 String key=c.getName(); //获取Cookie的key String value=c.getValue(); //获取cookie的值 } }
三、简单说一下Cookie的特点有什么?
- cookie存储在浏览器客户端,不安全;
- cookie中不能够存储中文
- cookie只能存储字符串(因为cookie最终在浏览器端;浏览器只识别字符串)
- cookie存储数据的大小有限制;cookie的大小不能超过4kb
四、什么是Session?为什么要用Session?
- Session是服务器端状态管理技术: session是服务器为浏览器创建的私人存储空间
因为http协议是无状态协议;服务器无法知道这次请求和上次请求是否来自同一个用户。通过session技术可以记录一次会话中用户的状态;
五、Session有什么特点?
- session和浏览器一一对应;一个浏览器对应一个session对象;当浏览器关闭后session失效
- session保存在服务器端,比较安全
- session可以存储对象
- session可以充当作用域
六、简单说一下Cookie和Session的区别?
相同点: 都是会话跟踪技术(状态管理技术);都跟浏览器有关
不同点:
- cookie存处在浏览器端,不安全;session存储在服务器端。比较安全
- cookie只能存储字符串,最大4kb;session可以存储对象;可以存储更大的数据
- cookie可以分担服务器压力,session不能
七、Session的底层原理?
- 当浏览器第一次访问服务器;并调用了request.getSession();的时候,服务器会创建Session对象;
HttpSession session=new HttpSession();
-
tomcat底层有一个map集合用来存储session,会将sessionId作为key,session对象作为值存储到map中//1.获取session的id; String sessionId=session.getId(); //2.根据id创建Cookie对象; Cookie c1=new Cookie(“JSESSIONID”,sessionId); //3.将cookie相应给浏览器,并存储在客户端; response.addCookie(c1);
- 当浏览器再次发出请求的时候回携带所有的该网站相关的Cookie对象到服务器;
- 当再次调用request.getSession();的时候,内部会执行验证
Cookie[] cookies=request.getCookies(); //获取所有的cookie对象 String value=null; if(cookies!=null){ for(Cookie c: cookies){ String name=c.getName(); //获取cookie的key if(“JSESSIONID”.equels(name)){ //看name是否为“JSESSIONID” value=c.getValue(); //获得session的唯一标记 } } } //根据id值获取session对象,并返回session对象 if(value!=null) Session=map.get(value); //根据session标记获取session //如果value为空的话应该也会返回创建一个session,并返回
注: 上面的操作应该是封装在getSession();里面的;当执行该方法的时候,如果没有从浏览器的cookie中获取到sessionID,或者是有sessionID但是时间已经超过了30分钟没有操作,map集合中已经没有了该id的key(服务器销毁了session对象),会新创建一个session对象并返回新创建的session对象(如果getSession(false)参数设置为false的时候不会创建);所以浏览器第一次访问服务器的时候调用getSession();方法里面第七步也被执行了,只不过没有找到而新建了一个session对象;并将这个session对象存储在了map集合中(第二步)
注: 参数为true:表示当session==null 的时候创建一个新的session,不为null时返回session参数为false:返回当前的session,为null的时候不会创建
八、Session的生命周期
- 当浏览器第一次访问;并且调用了request.getSession()的时候;session被创建出来
- 服务器一般设置session的时间是30分钟;如果没有操作的话session会被销毁并从map中清除
- 在一次会话中浏览器发出请求的时候,session的时间会重新计算
- 当浏览器关闭的时候session并没有立刻被销毁,只是浏览器端的cookie被销毁;下次访问服务器的时候因为没有id所以会新建session对象;原来的session对象在30分钟时间的到后会被清除销毁