Session的三种模式

详解ASP.NET Session配置与存储方式
本文深入探讨了ASP.NET中Session配置的各个方面,包括Session的存储方式、客户端存储方式选择、服务器端存储方式(InProc、StateServer、SqlServer)、以及如何在不同存储方式下配置相关参数。同时,解释了Cookie存储与Cookieless存储的区别,以及不同存储方式对性能的影响。
 如下是Web.config如何配置Session的:

<configuration>
  <system.web>
    <sessionState mode=" Off | InProc | StateServer | SQLServer "
    cookieless=" true | false "
    timeout=" number of minutes "
    stateConnectionString=" tcpip=server:port "
    sqlConnectionString=" sql connection string "
    stateNetworkTimeout=" number of seconds " />
  </system.web>
</configuration>

其中各个节点属性:

mode: Session的存储方式(必有的属性)。
InProc:将Session存到进程内(这是Default值。)
off:禁用Session.
StateServer:将Session存到独立的状态服务中(Asp.net State Service).
SqlServer:将Session存到SqlServer中。
Cookieless:设置客户端Session存储的方式。
false:使用Cookie模式(default).
true:使用Cookieless模式。
timeout:设置Session过期时间(default is 20 minutes)
stateConnectionString: 设置Session独立存放的状态服务所在服务器的名称(地址)和端口号,当              

         mode=stateserver时,这个属性就是必须的。
sqlConnectionString:设置与Sqlserver的连接字符串,当mode="sqlserver"时,这个属性时必须的。
stateNetWorkTimeout:设置当mode=StateServer时,经过多少秒空闲后, 断开web服务器与存储状态信息服务器  

                  的TCP/IP连接(default is 10 seconds).

/*******************************************************************/

asp.net中客户端Session的存储。
asp.net中,默认是使用Cookie存储Session的,如果是将cookieless="false",改成 cookieless="true",则

session就不用cookie来存储了,而是使用url来存储。

asp.net服务器端session存储在进程内(inproc)
当mode="Inproc"时,服务器的Session存储在IIS进程中,当IIS关闭,重启时,这些Session信息就会丢失,但这

种模式最大的 好处就是性能提高。

      asp.net服务器端Session存储在进程外(StateServer)
当mode="StateServer"时,服务器的Session就存储在"ASP.NET State Server"这个服务的进程中,在服务中找到

名为:ASP.NET State Service的服务,启动这个服务,在资源管理器的进程中就能找到一个名

为:aspnet_state.exe"的进程,这个就是我们保存 Session的进程。
ASP.NET State Server"服务可以与Web服务器分开.eg:web服务器在192.168.0.100上,asp.net

state service"服务在192.168.0.101上,则可以进行设置:
mode="StateServer" stateConnection="tcpip=192.168.1.101:42424".

     asp.net服务器端Session存储到SQLServer中(SQLServer),
当mode="sqlserver"时,服务器的Session就是存储到Sql server中建立一个存储Session的数据库。在
%windir%\Microsoft.NET\Framework\v2.0.50727 下有个名为: InstallSqlState.sql 的sql脚本文件. 这个脚本
是专门用来建存储Session的数据库以及一个维护Session信息数据库的SQL Server代理作业的.

      执行此sql脚本后,会看到一个新增的aspstate数据库,但这个数据库中,只有存储过程,没有用户表,用
户表放到了tempdb这个数据库中去 了,ASpstateTempSessions和ASPStateTempApplications,Session信息存储到
了 ASPStateTempApplication存储了asp中Application对象信息。




### 结束 HTTP Session 或数据库连接会话的方法 #### 方法一:通过应用程序逻辑控制 在设计 Web 应用程序时,可以通过编程方式显式地结束用户的会话。对于大多数现代框架而言,这通常涉及调用特定 API 来注销当前用户并清除其会话数据。 ```java // Java Servlet 示例 HttpSession session = request.getSession(false); if (session != null) { session.invalidate(); // 清除会话 } ``` 当处理数据库连接时,在不再需要访问数据库之后应当及时关闭连接对象以释放资源[^1]: ```csharp using (var conn = new SqlConnection(connectionString)) { await conn.OpenAsync(); // 执行查询... } // 这里的 using 语句确保即使发生异常也会自动关闭连接 ``` #### 方法二:设置超时机制 许多应用服务器和中间件支持配置闲置会话的最大存活时间。一旦超过设定的时间长度而没有任何活动,则认为该会话已经过期并将被销毁。同样地,数据库管理系统也提供了类似的参数来管理长时间未使用的连接。 例如,在 PostgreSQL 中可以调整 `idle_in_transaction_session_timeout` 参数以限制事务内空闲会话的持续时间[^3]: ```sql SET idle_in_transaction_session_timeout = '5min'; ``` 而对于 MySQL 数据库来说,可通过修改全局变量 `wait_timeout` 和 `interactive_timeout` 控制非交互式以及交互式的客户端连接等待超时时长: ```sql SET GLOBAL wait_timeout=300; SET GLOBAL interactive_timeout=300; ``` #### 方法三:强制终止连接/会话 某些情况下可能需要立即中断某个具体的会话或连接。针对这种情况,DBA 可以利用数据库提供的工具和服务来进行操作。比如 Oracle 提供了专门用于杀死指定会话的过程 `ALTER SYSTEM KILL SESSION`[^2];而在 SQL Server 上则可借助系统存储过程 `sp_who2` 查找目标 SPID 后执行 `KILL <SPID>` 命令实现相同目的。 对于 HTTP 请求级别的会话终结,Web 开发者可以在服务端代码中抛出异常或者返回特殊状态码(如 401 Unauthorized),从而促使前端重新认证或跳转到登录页面。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值