• cookie、session和会话保持


    1、会话

    在程序中,会话跟踪是很重要的事情。理论上,一个已登录用户,在这次登录后进行的所有请求操作都应该属于同一个会话,而另一个用户的所有请求操作则应该属于另一个会话,二者不能混淆。例如,用户 A 在某一商城登录后,然后又选购商品,将商品加入了购车等,这一系列的操作应该都属于同一个会话,而不用户 B 或用户 C 的操作又属于另外的会话。

    Web应用程序是使用HTTP协议传输数据的。HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接,这就意味着服务器无法从连接上跟踪会话,通俗点来说下一个接口无法知道上一个接口做了什么,保存了什么信息等。比如用户 A 将一件商品放入购物车内,当再次将商品加入服务器(又调用了一次接口),此时已经无法判断该购买行为是属于用户 A 的会话还是用户 B 的会话了。要跟踪该会话,必须引入一种机制。

    Cookie 就是这样的一种机制。它可以弥补HTTP协议无状态的不足。在 Session 出现之前,基本上所有的网站都采用 Cookie 来跟踪会话。

     

    2、cookie

    参考:https://www.cnblogs.com/wenxuehai/p/10470716.html

    3、session

    在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的 session 中,当用户使用浏览器访问其它程序时,其它程序可以从用户的 session 中取出该用户的数据,为用户服务。

    Session 代表着服务器和客户端一次会话的过程。Session 对象存储特定用户会话所需的信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的信息将不会丢失,而是在整个用户会话中一直存在下去。当客户端关闭会话,或者 Session 超时失效时会话结束。

    也就是说,session 的作用是能够让服务器在某一用户登录之后,用户进行的所有操作都保持在同一会话之内,这样就能够记住用户的状态,并且能记住用户在这次会话中进行的一系列操作和保存的信息。

    session 存储在服务器端,session 是用来存储信息的,在 cookie 里面插入的只是 session id,是识别某一 session 的唯一标识,

    3.1、session 基于 cookie 的实现

    服务器创建 session 出来后,会把 session 的唯一 id 号,以 cookie 的形式回写给客户机,这样,只要客户机的浏览器不关,再去访问服务器时,都会带着 session 的 id 号去,服务器发现客户机浏览器带session id过来了,就可以通过 session id 来识别出这次会话是属于哪次会话,就可以使用内存中与之对应的 session 为之服务。

    在创建了Session的同时,服务器会为该Session生成唯一的Session id,而这个Session id在随后的请求中会被用来重新获得已经创建的Session;在Session被创建之后,就可以调用Session相关的方法往Session中增加内容了,根据这些内容也可以识别出是当前是哪个用户(比如可以存储 userId 等用户信息),这些内容只会保存在服务器中,发到客户端的只有Session id;当客户端再次发送请求的时候,会将这个Session id带上,服务器接受到请求之后就会依据Session id找到相应的Session,从而再次使用之。

    3.2、session 的存储

    session 存储在服务器端,但不是保存在内存中,而是保存在文件或数据库中。 

    服务器端可以在每次相应时刷新 session 的过期时间,生成一个

    3.3、session 是如何刷新过期时间的

    每个用户访问,都会在服务器生成一个SESSION文件,当用户发起请求时,session 文件的过期时间就会被刷新。当一个SESSION文件,超过设定的时间没有被读写,则会被认为已过期,该文件就会被删除。

    session 是如何刷新过期时间的,参考:https://www.jianshu.com/p/328e5a63e23c

    4、session 和 cookie 的区别

    • 作用范围不同,Cookie 保存在客户端(浏览器),Session 保存在服务器端。
    • 存取方式的不同,Cookie 只能保存 ASCII,Session 可以存任意数据类型
    • 有效期不同,Cookie 可设置为长时间保持,比如我们经常使用的默认登录功能,Session 一般失效时间较短,客户端关闭或者 Session 超时都会失效。
    • 隐私策略不同,Cookie 存储在客户端,比较容易遭到不法获取,早期有人将用户的登录名和密码存储在 Cookie 中导致信息被窃取;Session 存储在服务端,安全性相对 Cookie 要好一些。
    • 存储大小不同, 单个 Cookie 保存的数据不能超过 4K,Session 可存储数据远高于 Cookie。

    5、会话保持

    会话保持是负载均衡最常见的问题之一,会话保持有时候又叫做粘滞会话(Sticky Sessions)。会话保持是指在负载均衡器上的一种机制,可以识别客户端与服务器之间交互过程的关联性,在作负载均衡的同时还保证一系列相关联的访问请求会分配到一台服务器上。

    5.1、什么时候需要会话保持

    比如在某些要求登录状态的情境下,要求客户端和服务器之间保持一个会话(session)以记录客户端的各种信息。比如在大多数电子商务的应用系统或者需要进行用户身份认证的在线系统中,一个客户与服务器经常经过好几次的交互过程才能完成一笔交易或者是一个请求的完成。由于这几次交互过程是密切相关的,服务器在进行这些交互过程的某一个交互步骤时往往需要了解上一次或上几次的交互过程处理结果,这就要求所有这些相关的交互过程都由一台服务器完成,而不能被负载均衡器分散到不同的服务器上。否则可能出现异常情景:

    1)客户端已经输入了正确的用户名和口令,但进行一些操作服务器并不知道该客户已登录,所以返回未登录提示信息,客户端反复跳到登录页面;
    2)用户输入了正确的验证码,但是总提示验证码错误
    3)客户端放入购物车的物品丢失,因为没有记住上次交互保存的信息


    因此会话保持机制的意义就在于,确保在合适的情境下,将来自相同客户端的请求转发至后端相同的服务器进行处理。换句话说,就是将客户端与服务器之间建立的多个连接,都发送到相同的服务器进行处理。如果在客户端和服务器之间部署了负载均衡设备,很有可能这多个连接会被转发至不同的服务器进行处理。如果服务器之间没有会话信息的同步机制,会导致其他服务器无法识别用户身份,造成用户在和应用系统发生交互时出现异常。

    5.2、基于cookie 和 session的会话保持实现

    用户第一次请求服务器的时候,服务器根据用户提交的相关信息,创建创建对应的 Session ,请求返回时将此 Session 的唯一标识信息 SessionID 返回给浏览器,浏览器接收到服务器返回的 SessionID 信息后,会将此信息存入到 Cookie 中,同时 Cookie 记录此 SessionID 属于哪个域名。

    当用户第二次访问服务器的时候,请求会自动判断此域名下是否存在 Cookie 信息,如果存在自动将 Cookie 信息也发送给服务端,服务端会从 Cookie 中获取 SessionID,再根据 SessionID 查找对应的 Session 信息,如果没有找到说明用户没有登录或者登录失效,如果找到 Session 证明用户已经登录可执行后面操作。SessionID 是连接 Cookie 和 Session 的一道桥梁,大部分系统也是根据此原理来验证用户登录状态。

    参考:https://blog.csdn.net/weixin_41646716/article/details/90243344https://blog.csdn.net/Dustin_CDS/article/details/79597379

    6、一个服务器如何根据 session 来区分不同的用户

    服务器是根据 session id 来区分用户的。当服务器接收到用 cookie 传过来的 session id 时,服务端会通过对比自身存储的 session Id 来判断用户之前是否存在,并返回对应的内容给不同用户。

    在创建了Session的同时,服务器会为该Session生成唯一的Session id,而这个Session id在随后的请求中会被用来重新获得已经创建的Session;在Session被创建之后,就可以调用Session相关的方法往Session中增加内容了,而这些内容只会保存在服务器中,发到客户端的只有Session id;当客户端再次发送请求的时候,会将这个Session id带上,服务器接受到请求之后就会依据Session id找到相应的Session,从而再次使用之。

    参考:https://blog.csdn.net/qq_17125355/article/details/44621195

    7、session 在项目中的使用详细介绍

    参考:https://www.cnblogs.com/saysmy/p/8535571.html

  • 相关阅读:
    ES6+ 现在就用系列(二):let 命令
    ES6+ 现在就用系列(一):为什么使用ES6+
    程序员之网络安全系列(六):动态密码
    程序员之网络安全系列(五):数字证书以及12306的证书问题
    程序员之网络安全系列(四):数据加密之非对称秘钥
    程序员之网络安全系列(三):数据加密之对称加密算法
    ddd
    vue加载时文件的执行顺序
    Kafka安装教程(详细过程)
    Kafka的安装与使用(转)
  • 原文地址:https://www.cnblogs.com/wenxuehai/p/12061301.html
Copyright © 2020-2023  润新知