cookie放在请求头_cookie和session 区别和联系 http

先来看cookie是什么

简单来说就是存储在客户端部分(如浏览器)的键值对信息。用于表面这个客户的一些信息。

比如我访问B站后有F12查看浏览器后有这个东西:

7c6a6929c433a1f12c8bc326fab0e5f7.png

具体如下:

Cookie:

_uuid=4D38E74C-049A-0AEF-CB2C-E1F02CBC8ED577062infoc; buvid3=23CA89D8-5400-4434-803F-0B3DE2272C7D48995infoc; LIVE_BUVID=AUTO3715522918551066; sid=8r0v8sm3; stardustvideo=1; CURRENT_FNVAL=16; UM_distinctid=169712a747da87-00c7accd0f4a6c-3d644509-1fa400-169712a747ea4d; fts=1552538720; rpdid=|(kmJY~kuJm|0J'ullYk|lJlk; finger=b3372c5f; im_notify_type_276475291=0; DedeUserID=276475291; DedeUserID__ckMd5=1fdf3a5f3e0c0f07; SESSDATA=99d67a12%2C1560180062%2Cc458e151; bili_jct=411f563ab5d4ab243674aa955ea4c857; CURRENT_QUALITY=80; bp_t_offset_276475291=256626177135519917; stardustpgcv=0606; _dfcaptcha=90a9949461ed7fab945e3b0a2a9b09e5

仔细看看是这样的:

_uuid=4D38E74C-049A-0AEF-CB2C-E1F02CBC8ED577062infoc;

buvid3=23CA89D8-5400-4434-803F-0B3DE2272C7D48995infoc; LIVE_BUVID=AUTO3715522918551066;

sid=8r0v8sm3;

stardustvideo=1;

CURRENT_FNVAL=16;

UM_distinctid=169712a747da87-00c7accd0f4a6c-3d644509-1fa400-169712a747ea4d;

fts=1552538720;

rpdid=|(kmJY~kuJm|0J'ullYk|lJlk;

finger=b3372c5f;

im_notify_type_276475291=0;

DedeUserID=276475291;

DedeUserID__ckMd5=1fdf3a5f3e0c0f07; SESSDATA=99d67a12%2C1560180062%2Cc458e151; bili_jct=411f563ab5d4ab243674aa955ea4c857;

CURRENT_QUALITY=80;

bp_t_offset_276475291=256626177135519917;

stardustpgcv=0606; _

dfcaptcha=90a9949461ed7fab945e3b0a2a9b09e5

这里大约有18个键值对。

说实际一点就是,cookie是存储在HTTP请求头里面的一个字段。

上面每一个键值对就是一个cookie,也就是说,请求头里面的cookie字段实际上是全部cookie的集合,通过分号隔开。也就是说,这里的是cookies,而不是单纯的cookie。

然后再来从chrome浏览器上查看这些cookie。如下:

c810d5096c1dcc8811e8905c5b126f0b.png

这些就是前面存储的key了,然后点开就有里面对应的属性等东西。

a25e2b0b88184d5c3d735e311fcdc462.png

在这里就不能用单纯的键值对来理解了,这里应该使用类和对象的概念来理解了。也就是cookie类。

ctrl+n idea查找一个类

这个类的几大属性:

name,value,maxage,path,domain.version

这几个属性可以和上面的数据对应。

name和value就可以理解为简单的键值对的对应。这个是直接放在HTTP的请求头里面的,前面已经介绍过了。

maxage是这个cookie的存活时间,当它为-1的时候,你一关掉浏览器就会删除这个cookie。设置成60x60就是这个cookie保存一个小时,也就是以秒为单位。然后这里还涉及到一个expires属性,这个是http1.0时候使用的maxage。可以参考 :

https://blog.csdn.net/cuishizun/article/details/81537316​blog.csdn.net

然后是path,这个设置的是这个cookie在访问什么路径时会发送。比如cookie.sePath("/login"),这就表示用户浏览器在访问整个login下的资源时都会回送cookie信息。如果是像前面的 / 的话,那就表示对站点所有目录下的访问路径都有效,也就是访问所有路径都会带上这个cookie。

domain一般是当前的主机名,也就是服务器的。对应前面的域名 bilibili.com 。设置的时候要加上 . 级setDomain(".bilibili.com").

这个cookie大概就介绍到这里。理解一下就是cookie的name和value才是要发送给服务器的,其它属性都是用来控制这个cookie的。

参考一个传智播客的一个demo来讲一下它的一个使用场景:使用cookie来记录用户上次访问时间。

注意下面是服务器的操作!!!

先创建一个cookie对象,cookie cookie1=new cookie("lastaccesstime",currenttime);

我们服务器发送http请求的时候是使用httpservletresponse response ,然后调用response .addcookie(cookie1);可以添加一个cookie对象返回给客户端

然后从request里读取cookie。这里知道读取的肯定是cookies,而不是一个cookie。request.getcookies()返回一个cookie数组,我估计这里里面就是使用字符串操作,以;为正则进行切割,然后按key-value封装在cookie对象当中。然后我们判断返回的cookie中是否有name为“lastaccesstime”的,有的话就读取从value,这样就获取了上次登录的时间了。

浏览器估计也是按照相应的代码来发送cookie。这里想想就知道了。

嗯,感觉cookie到这里就讲得差不多了。

然后来讲讲session吧。

简单来说,session是存储在服务器上的,用于映射客户端和一些情况。比如购物车中,A买了3个泡面,B买了4个泡面,那么这些信息都是存储在服务器中的。A登录的时候,只需要把能代表A的身份传过来即可,然后服务器去查A的身份后,找到它对应的对象,然后再取出相应的信息。

session是连接进来的时候就通过request的getsession方法创建,它借助cookie进行实现。它会自动生成id,然后我们手动把id通过cookie传到客户端。然后服务器再次getsession的时候,它就会自动读取客户端发送过来的cookie的id,然后找到这个id对应的session对象,也就是key是id,value是session。

具体来讲一个购物车demo就是:购物车对象是一个array list的cart(这里没有用户账号,只针对浏览器)

登录的时候,先getsession,然后查看有没有cart属性,如果没有,就设置进去,然后创建一个value为session id的cookie,返回给客户端。如果有,就获取出来,然后取出cart里的各种购物清单。此时返回的HTTP里应该是包含value为session id的cookie的。

这样就完成了。不过这是针对一个浏览器而言的(因为cookie都是存储在单个浏览器当中),按理说登录的时候都是要根据登录的账号来查看该账户的所有属性的。我没有这方面的开发经验,不过按我这小白的想法是,先判断账号登录成功与否,然后根据账号去做个hashmap建立一个id和类或者数据结构的映射关系。

想当年自己写QQ聊天室的时候,直接创建一个hashmap存储用户名和socket的对应关系。因为用户名是唯一的,所以你连接进来的时候,我就存储hashmap中,key为id,value为socket。这样其实简单来说也可以,可是人家如果用户名相同怎么办。这样的话,决定权来源于客户端。而session的决定权则来自服务器,因为这些都是在用户不知情的情况下产生的,除非你自己去手动修改cookie里的session id.一般来说默认应用层都是对用户隐藏的,用户只需要在交互界面操作即可。

总的来说,session就是存储在服务器的客户的信息表。cookie就是存储在浏览器的用于可服务器交互的一个键值对。

cookie的常用作用:

参考:https://blog.csdn.net/youzhouliu/article/details/51071964

94299ffb93a17b3a7a45ca9477c4dd1f.png

然后是解决记住登录的一种手段:

https://blog.csdn.net/qq_35181209/article/details/77488663​blog.csdn.net

感觉这个考虑的都是在同一设备上的情况,不同设备应该会有一个小细节要处理。

COOKIE和SESSION有什么区别?​www.zhihu.com

这里的区别讲得也不错,只不过篇幅较少,初学者理解起来不能具体化。

欢迎交流讨论。