Cookie与Session的工作原理以及区别

一、什么是Cookie?以及Cookie的简单的应用?
  • Cookie是一种客户端状态管理技术: cookie由客户端创建,由浏览器保存
    应用场景: 1. 记住用户名和密码 2.商品的浏览记录
二、Cookie的工作原理?如何创建Cookie对象?如何响应给浏览器?
  1. 浏览器第一次访问服务器;
  2. 在服务器端创建Cookie对象并相应给浏览器(会被浏览器保存在浏览器端)
    Cookie c1=new Cookie(key,value);  //创建cookie对象
    response.addCookie(c1);  //添加cookie到response中,最后会相应给浏览器
    c1.setMaxAge(参数);  //正数:存货多少秒;0:立即删除;-1:浏览器关闭时删除
    
  3. 浏览器非第一访问服务器;会携带所有保存过的本网站所有的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的特点有什么?
  1. cookie存储在浏览器客户端,不安全;
  2. cookie中不能够存储中文
  3. cookie只能存储字符串(因为cookie最终在浏览器端;浏览器只识别字符串)
  4. cookie存储数据的大小有限制;cookie的大小不能超过4kb
四、什么是Session?为什么要用Session?
  • Session是服务器端状态管理技术: session是服务器为浏览器创建的私人存储空间
    因为http协议是无状态协议;服务器无法知道这次请求和上次请求是否来自同一个用户。通过session技术可以记录一次会话中用户的状态;
五、Session有什么特点?
  1. session和浏览器一一对应;一个浏览器对应一个session对象;当浏览器关闭后session失效
  2. session保存在服务器端,比较安全
  3. session可以存储对象
  4. session可以充当作用域
六、简单说一下Cookie和Session的区别?

相同点: 都是会话跟踪技术(状态管理技术);都跟浏览器有关
不同点:

  1. cookie存处在浏览器端,不安全;session存储在服务器端。比较安全
  2. cookie只能存储字符串,最大4kb;session可以存储对象;可以存储更大的数据
  3. cookie可以分担服务器压力,session不能
七、Session的底层原理?
  1. 当浏览器第一次访问服务器;并调用了request.getSession();的时候,服务器会创建Session对象;
    HttpSession session=new HttpSession();
    
  2. //1.获取session的id; 
    String sessionId=session.getId();
    //2.根据id创建Cookie对象;
    Cookie c1=new Cookie(JSESSIONID,sessionId);
    //3.将cookie相应给浏览器,并存储在客户端;
    response.addCookie(c1);
    
    tomcat底层有一个map集合用来存储session,会将sessionId作为key,session对象作为值存储到map中
  3. 当浏览器再次发出请求的时候回携带所有的该网站相关的Cookie对象到服务器;
  4. 当再次调用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的生命周期
  1. 当浏览器第一次访问;并且调用了request.getSession()的时候;session被创建出来
  2. 服务器一般设置session的时间是30分钟;如果没有操作的话session会被销毁并从map中清除
  3. 在一次会话中浏览器发出请求的时候,session的时间会重新计算
  4. 当浏览器关闭的时候session并没有立刻被销毁,只是浏览器端的cookie被销毁;下次访问服务器的时候因为没有id所以会新建session对象;原来的session对象在30分钟时间的到后会被清除销毁
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值