参照:

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 存储,可以实现在多个服务器之间共享会话数据,确保应用程序的可伸缩性和可靠性。

asp.net里cookie、session进一步理解的更多相关文章

  1. ASP.NET里的Session详细解释

    Session模型简介 Session是什么呢?简单来说就是服务器给客户端的一个编号.当一台WWW服务器运行时,可能有若干个用户浏览正在运正在这台服务器上的网站.当每个用户首次与这台WWW服务器建立连 ...

  2. cookie&&session再理解笔记

    就拿php来说,两个php页面之间不拿get,post传递变量的话,数据是不能共享的.访问完1.php页面该页面的变量就被销毁了.所以就拿学校食堂来说,拿现金买饭的话你交完钱后,他给你个票以便确认你, ...

  3. asp.net 10 Cookie & Session

    Cookie 1.什么是Cookie 一小段文本,明文的数据,关于网站相关的文本字符串数据.一个客户端状态保持机制~ 存储在客户端的浏览器内存里面或者磁盘(如果不指定过期时间,那么存储在客户端浏览器内 ...

  4. Asp.Net里关于Session过期跳转页面的一些小技巧

    这里算是自己的个人随笔吧,仅供参考使用,后续有更好的方法再做补充 之前在Aspx页面里面,在Session过期的时候我经常会使用 Server.Transfer("b.aspx") ...

  5. 对session和cookie的一些理解

    由于项目需要,最近用session容器比较多,传载的同时加上了自己的一些理解,不足之处还请大家补充和纠正.);                  response.addCookie(c1);   * ...

  6. thinkphp里的session、cookie方法

    thinkphp里,对于session和cookie的操作,不管是存值.获取.删除,均只有一个方法.现分享出来,供大家参考参考. /** * session管理函数 * @param string|a ...

  7. Asp.net 服务器Application,Session,Cookie,ViewState和Cache区别

    2.8 Context 的使用Context 对象包含与当前页面相关的信息,提供对整个上下文的访问,包括请求.响应.以及上文中的Session 和Application 等信息.可以使用此对象在网页之 ...

  8. ecshop里操作session与cookie

    目录 操作session 操作cookie html模板里提交保存用用户名 php里 js里保存cookie js里读取cookie html模板里smart的保留变量 html模板里取session ...

  9. 对Cookie和Session的理解

    本篇文章系自己总结经验,如果有朋友感觉哪里有问题,欢迎留言评论,谢谢~! Cookie和Session的产生背景: 在动态页面里面,每个变量都是有有效期的,所有的变量的最大生命周期就是一个脚本的周期( ...

  10. 什么是cookie,作用是什么? 以及session的理解

    cookie: 1.定义:什么是cookie?  cookie就是存储在客户端的一小段文本 2.cookie是一门客户端的技术,因为cookie是存储在客户端浏览器中的 3.cookie的作用:是为了 ...

随机推荐

  1. 部署Palworld幻兽帕鲁服务器最佳实践(Ubuntu)

    本文为您介绍Ubuntu系统部署Palworld幻兽帕鲁服务器的最/佳实践. 1.登录云主机控制台,选择创建云主机的资源池,点击"创建云主机"按钮. 2.基础配置. CPU架构选择 ...

  2. 恭喜我同事的论文被IEEE HPCC收录!

    近日,由天翼云科技有限公司云网产品事业部天玑实验室撰写的<关于公有云区分负载QoS感知的内存资源动态超分管理优化>(Thoth:Provisioning Overcommitted Mem ...

  3. 识别与防御CSRF漏洞

    识别与防御CSRF漏洞 CSRF(Cross-Site Request Forgery,跨站请求伪造),通常也被称为"一键攻击"或"会话劫持",其缩写为CSRF ...

  4. SCCPC2024 游记

    打了一堆板子,一个都没用上. 队友:zhicheng,nityacke 开场发现 H 是签到,NIT 签了.然后盯 F(圆向某个方向运动,问存不存在一个时刻使得全在长方形之内),发现不外乎一堆二次方程 ...

  5. 优化-iceberg调参优化

    一.建表优化 1.iceberg表支持更新操作. 文档:https://iceberg.apache.org/docs/latest/configuration/ 功能描述:因v1只支持insert, ...

  6. Atcoder ABC387F Count Arrays 题解 [ 绿 ] [ 基环树 ] [ 树形 dp ] [ 前缀和优化 ]

    Count Arrays:一眼秒的计数题. 思路 显然,把小于等于的条件化为大的向小的连单向边,每个数的入度都是 \(1\),就会形成一个基环树森林. 那么考虑这个环上能填什么数.因为所有数都小于等于 ...

  7. Deepseek学习随笔(7)--- 构建私人知识库(附网盘链接)

    Step 1:创建知识库 入口定位 登录 DeepSeek 控制台 → 左侧导航栏点击「知识库」→ 点击「新建知识库」按钮 基础设置 知识库名称:建议使用「领域+用途」命名法,如「医疗-糖尿病文献库」 ...

  8. .NET周刊【2月第3期 2025-02-16】

    国内文章 我们是如何解决abp身上的几个痛点 https://www.cnblogs.com/jackyfei/p/18709265 张飞洪分享了abp框架在.net社区的使用经验,认为其在模块化.D ...

  9. Flink - [06] 状态管理

    题记部分 一.Flink中的状态 由一个任务维护,并且用来计算某个结果的所有数据,都属于这个任务的状态. 可以认为状态就是一个本地变量,可以被任务的业务逻辑访问. Flink会进行状态管理,包括状态一 ...

  10. Linux - 配置服务器之间SSH免密登录

    如果集群中服务器之间没有配置SSH免密,那么SSH访问其他服务器时就需要输入密码 一般都要设置密码强口令,又长又难记,就想配置一下SSH免密. 一.生成公钥和私钥 在ctos79-01执行如下命令,公 ...