参照:

session+cookie简单讲解以及持久化登录实现_session实现用户登录_AkagiSenpai的博客-CSDN博客

sessionID和cookie - 哈哈呵h - 博客园 (cnblogs.com)

概念介绍

cookie——是http无状态特性的补充,是在客户端保持状态的方案,以 key/value的形式进行保存。网站经常使用这个技术来识别用户是否登陆,记录用户购物车选购了几样商品等功能。几个注意点

  • 每次请求的时候,请求头会自动包含本网站此目录下的 cookie 数据,,不需要手动操作。
  • 如果不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了,这种生命期为浏览会话期的cookie被称为会话cookie。会话cookie一般保存在内存里
  • 如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie依然有效直到超过设定的过期时间。将最大时效设为0则是命令浏览器删除该cookie。
  • cookie可以在前端js修改(篡改一般也是在前端),也可以在服务器上设置和获取

session介绍

Session(会话):Session是服务器端维护的关于用户的状态信息。当用户与服务器建立连接时,服务器为每个用户创建一个唯一的会话,并分配一个唯一的Session ID。Session数据存储在服务器的内存或持久性存储中。通过Session,服务器可以跟踪和管理用户的状态,存储用户的身份验证信息、购物车内容等。

SessionId:当客户端第一次请求session对象时候,服务器会为客户端创建一个session,并将通过特殊算法算出一个session的ID,用来标识该session对象。Session ID是一个唯一的标识符,用于识别用户的会话。它通常以Cookie形式存储在用户的浏览器中,也可以通过URL重写等方式传递给客户端。客户端在每个请求中发送Session ID给服务器,以便服务器可以检索相关的会话数据并识别用户

session的几个点

  • session保存在服务器端
  • session与客户端是一一对应的,session设置后服务器会自动生成一个sessionid,Session ID是用于唯一标识和识别用户会话的标识符,通常以Cookie形式存储在客户端
  • 通过Session ID,服务器可以获取对应的会话数据,从而管理和跟踪用户的状态。(客户端在每个请求中发送Session ID给服务器,以便服务器可以检索相关的会话数据并识别用户,比如服务器可能同时需要记录多个用户的登录状态,A用户请求时,要确保拿到的是A用户的登录状态。请求携带的标识牌就是sessionId)
  • 会话的过期时间不仅取决于服务器端设置,还受到客户端浏览器对Cookie的处理影响。如果用户清除了浏览器的Cookie,会话将失效并需要重新创建

session、cookie、sessionId的关系

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

在Js里操作Cookie

要使用"jquery.cookie"插件,请按照以下步骤操作:

  1. 首先,确保已经引入jQuery库文件,可以通过以下方式在HTML中添加:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
  1. 然后,下载并引入"jquery.cookie"插件。您可以在 https://github.com/carhartl/jquery-cookie 下载插件文件,并将其放置在项目中,然后通过以下方式在HTML中引入:
<script src="path/to/jquery.cookie.js"></script>
  1. 现在,您可以使用以下示例代码来设置、获取和删除cookie:

设置cookie:

$.cookie('cookieName', 'cookieValue', { expires: 7, path: '/', domain: 'example.com' });

Cookie 的路径指告诉浏览器访问那些地址时该携带该 Cookie,我们知道浏览器会保存很多不同网站的 Cookie,比如百度的 Cookie,新浪的 Cookie,腾讯的 Cookie 等等。那我们不可能访问百度的时候携带新浪的 Cookie,也不可能访问每个网站时都带上所有的 Cookie 这是不现实的,所以往往我们还需要为 Cookie 设置一个 Path 属性,来告诉浏览器何时携带该Cookie

如:设置为 /项目名/路径 cookie.setPath(“/项目名/路径”),这样设置只有访问“/项目名/路径”下的的资源才会携带 Cookie

如:/项目名/路径/1.jsp 、/项目名/路径/hello/2.jsp 等,如果不设置,默认会在访问“/项目名”下的所有资源时携带

domain—设置生效域名,表示在此域名及子域名下,cookie可被共享访问,可作为多个子域名之间的登录状态共享

Session(会话):Session是服务器端维护的关于用户的状态信息。当用户与服务器建立连接时,服务器为每个用户创建一个唯一的会话,并分配一个唯一的Session ID。Session数据存储在服务器的内存或持久性存储中。通过Session,服务器可以跟踪和管理用户的状态,存储用户的身份验证信息、购物车内容等

获取cookie:

<script src="path/to/jquery.cookie.js"></script>

删除cookie:

$.removeCookie('cookieName');

请确保在使用上述代码之前,正确引入了jQuery库和"jquery.cookie"插件文件。

在Asp.NET里Cookie

ASP.NET 框架会自动为每个用户会话生成唯一的 Session ID,并将其存储在名为 "ASP.NET_SessionId" 的 Cookie 中。这个 Cookie 会在每个请求中发送到服务器,以便服务器可以识别用户的会话。

在使用 ASP.NET Session 时,不需要手动指定 Session ID。框架会处理会话的创建和管理,并自动关联请求中的 Session ID 和服务器上的会话数据。只需要使用 Session 对象来访问会话数据即可。

存储的形式

在 ASP.NET 中,会话(Session)数据可以以不同的形式进行存储。ASP.NET 提供了多种选项来存储会话数据,包括以下几种形式:

  1. In-Memory 存储:默认情况下,ASP.NET 会将会话数据存储在服务器内存中。这种方式适用于单个服务器和轻量级应用程序,但在负载较重的情况下,可能会对服务器的内存消耗产生影响。

    优点:速度快,适用于轻量级应用程序和单个服务器环境。不需要额外的配置和外部依赖。

    缺点:会话数据存储在服务器内存中,可能会对服务器的内存消耗产生影响。不支持多服务器环境下的共享会话。Session数据容易丢失

  2. State Server 存储:ASP.NET 提供了一个称为 "ASP.NET State Service" 的独立服务,可用于将会话数据存储在一个单独的进程中。这种方式可以在多个服务器之间共享会话数据,适用于具有负载均衡的 Web 应用程序,Session数据能保存。

    优点:会话数据存储在一个独立的进程中,可以在多个服务器之间共享会话数据。适用于负载均衡和扩展性要求高的应用程序。

    缺点:相对于 In-Memory 存储,访问 State Server 存储会有一定的性能开销。需要配置和管理独立的 State Server 服务。

  3. SQL Server 存储:ASP.NET 还支持将会话数据存储在 SQL Server 数据库中。通过配置连接字符串和相关设置,可以将会话数据持久化到数据库,从而实现可扩展和持久化的会话管理。

  4. Custom 存储:如果需要更高度的自定义和控制,您可以实现自己的会话存储提供程序。通过实现抽象类 System.Web.SessionState.SessionStateStoreProviderBase,您可以定义自己的会话存储机制,例如使用缓存、分布式存储等。

    优点:会话数据存储在 SQL Server 数据库中,具有持久性和可伸缩性。适用于需要长期存储会话数据、可在多个服务器之间共享数据的场景。

    缺点:相对于 In-Memory 存储和 State Server 存储,访问 SQL Server 存储会有更高的延迟和性能开销。需要配置和管理数据库连接。

要选择适当的会话存储形式,可以根据应用程序的需求、可伸缩性要求和预算等因素进行评估和选择。默认情况下,ASP.NET 使用 In-Memory 存储,但可以通过配置文件进行更改。

可以通过在 web.config 文件中的 <sessionState> 元素中进行设置来配置会话存储方式。例如:

<sessionState mode="SQLServer" sqlConnectionString="your_connection_string" />

State Server 存储方式实现(解决内存方式失效问题)

State Server 存储的步骤:

1、配置 State Server:

  • 打开应用程序的 Web.config 文件。

  • <system.web> 元素下添加以下内容:

    <sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" cookieless="false" timeout="240" />
    

    其中,ip_address 是 State Server 服务的 IP 地址,port 是 State Server 服务的端口号。如果 State Server 服务与应用程序在同一台服务器上,则可以使用 "localhost" 和默认端口 "42424"。cookieless="false":指定会话状态是否使用 Cookie 来存储会话标识符。timeout="240":指定会话的超时时间,单位为分钟。在此示例中,设置为 240,表示会话在 240 分钟(4 小时)没有活动时将过期

  • 保存并关闭 Web.config 文件。

2、启动 State Server 服务——aspnet_state服务:

  • 在运行 State Server 的服务器上,打开命令提示符(或 PowerShell)。

  • 输入以下命令来启动 State Server 服务:

    aspnet_state -port port_number -lcid lcid_number

    其中,port_number 是用于通信的端口号,与 Web.config 中配置的端口号一致。lcid_number 是 State Server 服务的区域设置标识符(默认为 0)。

3、配置应用程序:在需要使用会话的页面或代码中,可以通过 Session 对象来访问会话数据,无需进行其他特殊设置。当使用 State Server 存储会话数据时,会话中的对象需要进行序列化和反序列化,以便在不同服务器之间传输和存储。在 ASP.NET 中,要确保会话中的对象可以正确地进行序列化和反序列化,需要满足以下条件:

  • 类型必须可序列化:会话中的对象必须标记为可序列化。要将一个类标记为可序列化,可以使用 [Serializable] 特性进行声明。例如:

    [Serializable]
    public class MyClass
    {
    // 类的成员和逻辑
    }
    
  • 会话数据的对象必须是可访问的,要声明成Public

  • 对象中的字段和属性必须可序列化,对于不想序列化的字段,可以使用 [NonSerialized] 特性来标记不需要序列化的字段

    [Serializable]
    public class MyClass
    {
        [NonSerialized]
        public int field1;  // 不需要序列化的字段
    
        // 其他需要序列化的字段
    }
    
    

需要注意以下几点:

  • State Server 服务可以在多个应用程序之间共享,只要它们使用相同的 State Server 配置。
  • State Server 存储仅存储会话数据,不包含任何敏感或保密信息。如需存储敏感信息,请使用加密或其他安全措施。
  • State Server 存储不适用于跨网络较高延迟的环境,因为会话数据的读写需要通过网络通信。

通过配置和使用 State Server 存储,可以实现在多个服务器之间共享会话数据,确保应用程序的可伸缩性和可靠性。