首页 > 编程语言 >asp.net里cookie、session进一步理解

asp.net里cookie、session进一步理解

时间:2023-06-07 14:45:12浏览次数:58  
标签:存储 asp Session Server 会话 session cookie 服务器

参照:

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,Session,Server,会话,session,cookie,服务器
From: https://www.cnblogs.com/summerZoo/p/17463254.html

相关文章

  • Exploiting Positional Information for Session-based Recommendation
    目录概符号说明Forward/Backward-awarenessDualPositionalEncodingQiuR.,HuangZ.,ChenT.andYinH.Exploitingpositionalinformationforsession-basedrecommendation.ACMTransactionsonInformationSystems,2021.概本文讨论了一些常用positionalencodi......
  • cookies Web Storage API
    https://developer.mozilla.org/zh-CN/docs/web/api/document/cookie从Firefox2起,有更好的客户端存储机制用以替代cookie- WHATWGDOMStorage (en-US).你可以通过更新一个cookie的过期时间为0来删除一个cookie。请注意,更多/更大的cookies意味着每个请求都要包......
  • haproxy.router.openshift.io/disable_cookies
    haproxy.router.openshift.io/disable_cookies是OpenShift中Route对象的一个注解,用于控制是否禁用HAProxy负载均衡器在请求和响应中添加Cookie。当该注解设置为true时,HAProxy负载均衡器将不会在请求和响应中添加Cookie。这对于一些特定的应用程序场景可能非常有用,例......
  • Cookie、localStorage、sessionStorage
    本文参考了以下视频cookie、localStorage和sessionStorage的区别及应用实例浏览器本地存储CookieCookie是一种存储机制HTTPCookie(也叫WebCookie或浏览器Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据(一般不超过4kb)。浏览器会存储cookie并在下次向同一......
  • ARN [main-SendThread(db99:2222)] zookeeper.ClientCnxn: Session 0x0 for server n
    1.2014-07-2117:24:36,310WARN [main-SendThread(db99:2222)]zookeeper.ClientCnxn:Session0x0forservernull,unexpectederror,closingsocketconnectionandattemptingreconnectjava.net.ConnectException:拒绝连接     ......
  • 基于Raspberry 的 libcamera 使用
    1.libcameraandlibcamera-apps工具简介I.libcamera是一款用来支持用户基于Linux操作系统控制复杂相机的应用程序,用户可以通过libcamera直接操作树莓派芯片集成的GPU模块。II.libcamera开放了基于C++语言的应用程序接口用于配置相机并从相机获取图像的功能API,同时libcam......
  • Asp.Net Core 程序部署到Linux(centos)生产环境(二):docker部署
    运行环境照例,先亮环境;软件的话我这里假设你已经批准好了.netcore运行环境,未配置可以看我的这篇[linux(centos)搭建.netcore运行环境]腾讯云centos:7.2cpu:1核2G内存1M带宽docker:18.06.1-ce安装docker安装其实很简单,就不重复说了,请查看纯洁大神这篇文章准备你的.netcoreweb程......
  • aspose word与pdf互转
    asposeword与pdf互转packagecom.example.core.mydemo.aspose;importcom.aspose.words.Document;importcom.aspose.words.License;importcom.aspose.words.SaveFormat;importjava.io.ByteArrayInputStream;importjava.io.File;importjava.io.FileOutputStream;......
  • 手把手教你AspNetCore WebApi:Swagger(Api文档)
    前言小明已经实现“待办事项”的增删改查,并美滋滋向负责前端的小红介绍Api接口,小红很忙,暂时没有时间听小明介绍,希望小明能给个Api文档。对于码农小明来说能不写文档就尽量不要写,不过这也难不倒小明,他知道Swagger不仅可以自动生成Api文档,并还可以用Swagger进行接口测试。Swagger是什......
  • 手把手教你AspNetCore WebApi:数据验证
    前言小明最近又遇到麻烦了,小红希望对接接口传送的数据进行验证,既然是小红要求,那小明说什么都得满足呀,这还不简单嘛。传统验证[HttpPost]publicasyncTask<ActionResult<Todo>>PostTodo(Todotodo){if(string.IsNullOrEmpty(todo.Name)){returnOk("名称不......