0%

Cookie Session 的作用

Http连接是无状态协议,就是说,当一次请求完成,发送第二次请求的时候,浏览器是不会记录上一次请求的状态的。如果真的是这样,那么请思考下面两个问题:

  1. 一个用户登录系统,假设你已经登录成功,当你跳转到某个新页面的时候,由于无状态协议,服务器没有记录你登录成功的状态,你是不是要重新登录?
  2. 假设你在淘宝上买东西,当用户把商品加入购物车,点击下单,这又产生了一个新的请求,而服务器如何识别是哪个用户的下单请求,从而去找到对应的用户的购物车里的商品信息?

Cookie 和 Session 的作用

​ 为了解决上面两个问题,我们的服务器需要一个机制,用来保存发送请求的浏览器的一些信息,这样,在你登录成功了之后,并且跳转页面的时候,服务器收到你的请求会明白你是之前登录过的用户,并且在返回页面时给你保留登录信息。

登录状态保持1

登录状态保持2

​ 可以看到,当你在 bilibili 上登录之后,你的导航栏会发生变化,而当你跳转到一个新的页面之后,你的导航栏仍然会是已经登录后的状态。这种效果实现的方式就是要依靠 Cookie 和 Session

​ Cookie 是存储在浏览器里的,结构类似 map ,当用户第一次登录的时候,服务器收到请求后会在 cookie 里生成一个键值对,其 key = “SessionID” ;value = sessionID。并且,服务器会生成一个 Session ,也是并且把用户信息以键值对的形式存进去,然后,服务器会把 cookie 返回给浏览器,当浏览器向服务器发送一个新的请求的时候,会一并把 cookie 发送过去,服务器会遍历 cookie 找到对应的 “SessionID” 从而找到对应的 Session ,取出里面的用户信息,从而判断出发送请求的是哪个用户,该用户是否已经登录。

cookie session 原理

总结

  • Cookie 是存储在浏览器里的,存储着一条条键值对 <String, String>,其中的 SessionID 对应着服务器的某个 session。
cookie
  • Session 是存储在服务器里的,存储着一条条键值对<String, Object>,主要是浏览器(用户)的各种信息。session 的运行依赖 session id,而 session id 是存在 cookie 中的,也就是说,如果浏览器禁用了 cookie ,同时 session 也会失效(但是可以通过其它方式实现,比如在 url 中传递 session_id)。session 的实现方法是有很多中,可以是数据库,可以是内存,可以是文件(默认),本质是一种键值对的存储结构。

  • cookie 和 session 都可以手动设定生命周期,cookie 默认是浏览器关闭便删除,session 默认是20分钟若没有活动访问便删除掉

  • cookie 除了存放 sessionID 还可以存放其他用户信息,这样前端可以在访问服务器之前自动做一步处理,比如你登录某个网站,在密码框会自动弹出你之前登录时输入的密码,但是这么使用 cookie 是不安全的,如果你的 cookie 被人截获,那么你里面存储的用户信息都会泄漏,所以一般是使用 cookie session 结合的方式。但是,这样仍存在一个安全问题,如果你的 cookie 被人截获,只需要把你的 cookie 转发给服务器,让服务器的 session 来解析,仍然可以登录你的账户