时间:2021-07-01 10:21:17 帮助过:4人阅读
浏览器每打开一个页面,都算建立一个新的会话吗?
会话是维护某些连续访问状态的,HTTP是无状态的,你先打开 http://www.xxx.com/1/ 再打开 http://www.xxx.com/2/ 或者你刷新了一下页面,在服务器这边我怎么知道你是同一个人呢?IPv4 不靠谱,你一个公司可能就一个外部 IP,如果再经过几级非透明的代理,就更没准了。
但是这种想要维持状态需求是硬需求呀,总的解决呀。如是就想出只要每次请求,都带上一个标明唯一身份的ID不就搞定了,如果第一次没带,就给他指定一个。在具体的实现里,通常通过 Cookie 或附加在 URL 上传递,这个 ID 也就是 SessionID,通常不同的服务端环境会有固定的名称,比如 PHP 的通常叫 PHPSESSID, Servlet 的通常叫 jsessionid 等等,当然你可以取个其他名字,只要达成传递"标明身份的ID"这一目的即可。
再说说服务端的 SESSION 是怎么回事。服务端对 SESSION 来说就相当于有个 Key-Value 数据库,这个库可以是文件系统,也可以是其他关系数据库、键值数据库。通过浏览器送过来的 SessionID,取出对应的 Session 数据,这个数据,就是通常说的会话数据了。
你提到“浏览器每打开一个页面,都算建立一个新的会话吗?”,这个问题很好,这里要说下会话的生命周期,其实应该分两块讲,一个是会话ID的生命周期,一个是会话数据的生命周期。
会话ID的生命周期:目前比较普遍的传递 SessionID 的方法是通过 Cookie 来传递,一条 Cookie 记录大概有这么几个属性:名称、取值、路径、域名、过期时间等,你提到的“打开一个页面”,我想应该纠正为“打开浏览器”,这种过期时间通常称为会话期,也就是关闭、重开浏览器,原cookie就失效(亦即不再传递了)。但并非所有 SessionID 的过期都必须如此,你可以为你的 sessionid 的 cookie 设置有效期,并可以在每次访问时都加长这个时间,这样即使关闭再开浏览器,只要用户不手动清空 cookie 都可以继续传递,继续记住你的状态。
会话数据的生命周期:在服务端,我们同样可以为 Session 设置一个过期时间,如超过 30 分钟无读写就失效(亦即删除或不返回)。当然,不同的服务端软件环境,可能有不同的对此时间的默认设置和设置方法。
再说说登录的事。
用户登录跟这个 Session 有什么关系呢?简单来说,登录就是在你的 Session 数据里记录了你的用户身份,亦即将当前 SessionID 与用户(ID) 直接进行了关联,当然如果你乐意,你的 SessionID 可以与用户ID完全等同(最好加密或混淆)。
Session 跟登录状态并没必然的关系,比如你上某电商网站,你不登录也一样的把商品放到你的购物车,对电商网站来说,他可以把你的购物车数据放在 Session,Cookie,LocalStoreage,SesisonStoreage 都行,第一个在服务端,第二个客户端、服务端同步传递,后两个是纯客户端的。不管什么办法,此时对电商网站来说只需要知道某个临时客户 ABCDEF(SessionID) 拿了这一堆东西,到你要结账时才需要你登录表明身份,好让你付钱和寄送到你早已填好的地址。如果这个电商觉得他跟你之后的交易也不多(一锤子买卖),根本不想知道你是谁,付款流程也很简单(扫扫二维码),他完全可以不需要你登录。
最明显的例子是众多的广告平台,到处嵌码来追踪你的 Cookie (其实就是记录和分析你的一些浏览状态、浏览历史),这样他就知道你去过哪些网站,都喜欢什么内容,就可以定向给你推送广告了。但为了避免不必要的麻烦,他并不想知道你具体是谁(或不愿你知道他的存在),他就可以不需要给你弹那么个登录对话框了;这种情况下,你在他的平台是“匿名”的,但他仍然可以了解你很多。
因为自己以前做过多年互联网广告领域的开发,每次跟人解释广告这个例子的时候,别人都很害怕,怎么“种”个 cookie 就能“跟踪”我的浏览记录了?
不是这样的。
广告平台会跟内容网站合作,让内容网站嵌入一小段代码,这个代码可以是一个js、或者