My Little World

session 和cookie

正常情况下身份识别

用户提交登录信息,服务器拿到登录信息进行验证之后,
为该用户在session表中建立唯一sessionid,然后在返回响应的时候,将sessionid放在set-cookie中告诉浏览器,将sessionid 放在cookie表中,下次请求的时候放在cookie中再发给我
这样用户在已登录的状态下进行的访问请求,浏览器都会在报文中将sessionid放在cookie中给回服务器
服务器拿到cookie 就能判断用户是否进行了登录,并根据session表确定登录身份

session 机制

当用户访问服务器时,服务器就会先检查请求有没有带sessionid,
如果没带的话,就为该用户在session列表中建立一个session,
(这个session是存储特定用户会话所需的属性及配置信息的一个对象,开发人员可以控制里面是什么内容,可以自定义的)
并生成唯一sessionid通过set-cookie给回用户
如果有带的话,就根据sessionid 在列表中查找对应的session,将session 取出来使用,如果没找到则可能新建一个

1.浏览器禁用cookie解决办法
让浏览器重写url:将sessionid 以参数或者附加信息方式放在url后面传递给服务器
表单隐藏字段:服务器在返回表单的时候就将sessionid 以隐藏字段方式给过去,客户端提交表单的时候就一并传回来

2.session什么时候被删除
过期就会自动删除
执行特定删除命令的时候,比如注销
session存在内存中的时候,当服务器被重启或者停止时,session列表会被清空

3.session存储
一般存在内存中,但服务器重启或者停止会被清空
如果想持久保存,可以放在硬盘里面,这样服务器重启或者停止不会被清空

cookie 机制

浏览器拿到set-cookie后,会根据sessionid ,域名,路径等相关信息,生成cookie,存到cookie列表中
当用户要请求服务器时,就根据请求资源路径去查cookie表,找到的cookie可用的范围如果大于等于请求路径,
就将cookie放在请求头给回服务器

1.cookie存储
会话cookie存储在内存中,页面关闭就删除
设置了过期时间的cookie,会被存储在硬盘上,直到超过设定时间才会被删除

2.cookie与浏览器
存储在硬盘上的cookie可以在不同浏览器进程间共享
对于内存上的cookie不同浏览器有不同处理方式
IE通过 ctrl+N 的方式打开的窗口可以与原窗口共享cookie,但其他方式不行
而火狐的所有进程和标签页都可以共享cookie

一般情况下通过js window.open打开的窗口会与原窗口共享内存cookie

游客识别跟踪

用户未登录情况下进行页面请求,且之后都不进行登录操作的情况下,还要与用户保持可进行身份识别的通信,
这种情景解决办法可以有
A.
一般就需要依靠识别机器来识别用户了
首先给未登录用户设置访问用户cookie,
根据不同机型用canvas写字像素是不一样的原理
这个cookie由游客设备的各种机器特征码组合起来生成给到服务器,
服务器存起来
下次再访问的时候,就依靠客户端建立的cookie进行识别
或者将机器信息传给服务器,由服务器生成再传给浏览器

B.
使用fingerprint.js包,它是一个可以根据浏览器的代理字符串,屏幕色深,语言,插件安装与支持的 MIME 类型,时区偏移量和其他功能,如本地存储和会话存储等等,
然后这些值通过散列函数传递产生指纹,不需要通过 Cookie 存储就可以识别浏览器

由未登录到登录态要做的事情就要注意两个账号的关联

奇葩问题:在一台设备登录过多个账号的情况下,怎样进行未登录数据的关联
首先设备一般会让你先退出再登录另一个账号,
即便要登录多个账号,要做关联,在第一个用户登录后就关联完了,后面多个再登录已经不再是由未登录到登录状态了