(废话)昨晚做完b站的笔试,果然,“bilibili,年轻人秋招笔试信心加油站!”。
session和cookie出现的原因
因为由于http是无状态,在服务器响应完毕以后,服务端和客户端的连接就断开了,这个过程称为一次会话结束,但有些场景,比如要进行登录记住密码或者多长时间免登录之类的,这时就要用的session和cookie。
cookie和session的工作原理
cookie
cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示。浏览器按照指示生成相应的cookie,之后每次和服务端发送信息的时候就将此cookie发送给服务端,服务端根据cookie来判断是不是一个用户,cookie是可以修改的。cooki的安全问题也就是这么来的,好事者往往可以通过拦截或本地文件找得到你的cookie后干一些坏事(我不是我没有)。
cookie的内容主要包括:名字,值,过期时间,路径和域。路径与域一起构成cookie的作用范围。若不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,关闭浏览器窗口,cookie就消失。这种生命期为浏览器会话期的cookie被称为会话cookie。会话cookie一般保存在内存里。若设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,只要在时间范围内这些cookie就是有效的,存储在硬盘上的cookie可以在不同的浏览器进程间共享。而对于保存在内存里的cookie,不同的浏览器有不同的处理方式。
session
session机制是一种服务器端的机制,服务器使用散列表的结构来保存信息。当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否已包含了一个session标识(sessionId),如果已包含则说明以前已经为此客户端创建过session,服务器就按照sessionId把这个session检索出来
使用(检索不到,会新建一个),sessionId的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存在cookie中。
session是保存在服务器端上会存在一段时间才会消失,如果session过多会增加服务器的压力。session依赖于cookie。
要注意的是:尽管session是基于cookie的,但是本地禁用cookie后,使用url重写等方法(把sessionid作为参数追加的url中)的话依旧是能够使用session的。
cookie和session的区别
面试官:cookie和session有什么区别?
1、cookie和Session都是会话技术,cookie是运行在客户端,session是运行在服务器端。
2、cookie有大小限制,只能存放4k的数据;session不进行大小限制;
3、cookie存在安全问题;
4、Session是保存在服务器端上会存在一段时间才会消失,如果session过多会增加服务器的压力。
5、session依赖于cookie,cookie可以设置过期时间;
6、使用场景不同,cookie常用于自动登录,session常见的应用场景是会话。
分布式session(不了解)
客户端向服务器发送一个请求,这个请求被随机分配到其中一个服务器上,比如第一次用户在 A 服务器登录了,第二次请求跑到服务 B就会出现登录失效问题。这时该怎么办?
Session 复制:任何一个服务器上的 Session 发生改变,就在一个局域网里面发送广播,让其他服务器全都更新,这在实际中应用并不多,因为当用户量太大时,内存就会不足;
Nginx ip_hash 策略:服务端使用 Nginx 代理,每个请求按访问 IP 的 hash 分配,这样来自同一 IP固定访问一个后台服务器,避免了在服务器 A 创建 Session,第二次分发到服务器 B 的现象。
基于redis存储Session