.net Session 详解

(一) 描述
当用户在 Web 应用程序中导航 ASP.NET 页时,ASP.NET 会话状态使您能够存储和检索用户的值。HTTP 是一种无状态协议。这意味着 Web 服务器会将针对页面的每个 HTTP 请求作为独立的请求进行处理。服务器不会保留以前的请求过程中所使用的变量值的任何信息。
ASP.NET 会话状态将来自限定时间范围内的同一浏览器的请求标识为一个会话,当每个用户首次与这台WWW服务器建立连接时,他就与这个服务器建立了一个Session,同时服务器会自动为其分配一个SessionID,用以标识这个用户的唯一身份。Session提供用于在该会话持续期间内保留变量值的方法。默认情况下,将为所有 ASP.NET 应用程序启用ASP.NET 会话状态.
会话变量可以是任何有效的 .NET Framework 类型, 注意:当使用 InProc 以外的会话状态模式时,会话变量类型必须为基元 .NET 类型或可序列化的类型。这是因为会话变量值存储在外部数据存储区中。
会话由一个唯一标识符标识,可使用 SessionID 属性读取此标识符。为 ASP.NET 应用程序启用会话状态时,将检查应用程序中每个页面请求是否有浏览器发送的 SessionID 值。如果未提供任何 SessionID 值,则 ASP.NET 将启动一个新会话,并将该会话的 SessionID 值随响应一起发送到浏览器。 
默认情况下,SessionID 值存储在 Cookie 中。但也可以将应用程序配置为在“无 Cookie”会话的 URL 中存储 SessionID 值。只要一直使用相同的 SessionID 值来发送请求,会话就被视为活动的。如果特定会话的请求间隔超过指定的超时值(以分钟为单位),则该会话被视为已过期。使用过期的 SessionID 值发送的请求将生成一个新的会话。 
安全说明: 
无论是作为 Cookie 还是作为 URL 的一部分,System.Web.SessionState.HttpSessionState.SessionID 值都以明文的形式发送。恶意用户通过获取 SessionID 值并将其包含在对服务器的请求中,可以访问另一位用户的会话。如果您将敏感信息存储在会话状态中,建议使用 SSL 来加密浏览器和服务器之间包含 SessionID 值的任何通信。 
默认情况下,SessionID 值存储在浏览器的不过期会话 Cookie 中。但是,通过在 Web.config 文件的 sessionState 节中将 cookieless 属性设置为 true,可以指定不应将会话标识符存储在 Cookie 中。
<configuration>
  <system.web>
    <sessionState cookieless="true"
      regenerateExpiredSessionId="true" />
  </system.web>
</configuration>
ASP.NET 通过自动在页的 URL 中插入唯一的会话 ID 来保持无 Cookie 会话状态。例如,下面的 URL 已被 ASP.NET 修改,以包含唯一的会话 ID lit3py55t21z5v55vlm25s55:
http://www.example.com/(S(lit3py55t21z5v55vlm25s55))/orderform.aspx
(二)配置会话状态
通过使用 system.web 配置节的 sessionState 元素可配置会话状态。还可以通过使用 @ Page 指令中的 EnableSessionState 值来配置会话状态。 
使用 sessionState 元素可指定以下选项: 
•    会话存储数据所使用的模式。
•    在客户端和服务器间发送会话标识符值的方式。
•    会话的 Timeout 值。
•    支持基于会话 Mode 设置的值。
下面的示例演示一个 sessionState 元素,该元素将配置应用程序的 SQLServer 会话模式。该元素将 Timeout 值设置为 30 分钟,并指定将会话标识符存储在 URL 中。 
 <sessionState mode="SQLServer"
   cookieless="true "
   regenerateExpiredSessionId="true "
   timeout="30"
   sqlConnectionString="Data Source=MySqlServer;Integrated Security=SSPI;"
   stateNetworkTimeout="30"/>
可以通过将会话状态模式设置为 Off 来禁用应用程序的会话状态。如果只希望禁用应用程序的某个特定页的会话状态,则可以将 @ Page 指令中的 EnableSessionState 值设置为 false。还可将 EnableSessionState 值设置为 ReadOnly 以提供对会话变量的只读访问。
注意:timeout是指会话的时间,单位是分钟,也就是如果客户端在timeout的时间内没有向服务器放送过请求,会话终止,所有的session数据将丢失。 
(三)会话模式 
ASP.NET 会话状态支持若干用于会话数据的存储选项。每个选项都由 SessionStateMode 枚举中的一个值标识。下面的列表描述了可用的会话状态模式: 
•    InProc 模式,此模式将会话状态存储在 Web 服务器上的内存中。这是默认设置。
•    StateServer 模式,此模式将会话状态存储在一个名为 ASP.NET 状态服务的单独进程中。这确保了在重新启动 Web 应用程序时会保留会话状态,并让会话状态可用于网络场中的多个 Web 服务器。
•    SQLServer 模式将会话状态存储到一个 SQL Server 数据库中。这确保了在重新启动 Web 应用程序时会保留会话状态,并让会话状态可用于网络场中的多个 Web 服务器。
•    Custom 模式,此模式允许您指定自定义存储提供程序。
•    Off 模式,此模式禁用会话状态。
通过在应用程序的 Web.config 文件中为 sessionState 元素的 mode 属性分配一个 SessionStateMode 枚举值,可以指定要让 ASP.NET 会话状态使用的模式。除了 InProc 和 Off 之外,其他模式都需要附加参数,例如将在本主题后面讨论的连接字符串值。通过访问 HttpSessionStateMode 属性的值,可以查看当前选定的会话状态。 
(四)示例 
1. Login.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Login.aspx.cs" Inherits="Login" %>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head runat="server">
     <title>Untitled Page</title>
 </head>
 <body>
     <form. id="form1" runat="server">

<asp:Button ID="mLoginButton" runat="server" Text="Login" 
             nclick="mLoginButton_Click" />

</form>
 </body>
 </html>

Login.aspx.cs
public partial class Login : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
 
    }
    protected void mLoginButton_Click(object sender, EventArgs e)
    {
        Session["loginName"] = "Jack Wang" + DateTime.Now.ToString(); 
        Response.Redirect("Default.aspx");
    }
}
2. Default.aspx页 
  <%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head runat="server">
     <title>Session Sample</title>
 </head>
 <body>
     <form. id="form1" runat="server">

<asp:Button ID="mGetSessionButton" runat="server" Text="Get Session"
             nclick="mGetSessionButton_Click"   />
         <asp:Label ID="mShowSessionContentLabel" runat="server"></asp:Label>

</form>
 </body>
 </html> 
Default.aspx.cs 
public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {
        //Response.AddHeader("Refresh", (Session.Timeout*1000).ToString() + ";URL=Login.aspx");
        if (string.IsNullOrEmpty(Session["loginName"] as string))
        {
            Response.Redirect("Login.aspx");
        }
    }
    protected void mGetSessionButton_Click(object sender, EventArgs e)
    {
        mShowSessionContentLabel.Text = "
Now is:" + DateTime.Now.ToString() + "
Session Content:" +
            Session["loginName"] as string + "
SessionId:" + Session.SessionID.ToString()
            +"
session start time:"+ Session["startTime"] as string;
    }
 
3. 示例不同的模式,配置web.config
a. InProc模式 
<sessionState mode="InProc" timeout="2"></sessionState>         
          (1) 测试页面 ,过两分钟后再点击Get Session将返回到Login.aspx页,因为session过期

(2)重启web服务,点击Get Session将返回到Login.aspx页,因为session丢失 
b. StateServer模式 
注意:如果模式设置为 StateServer,则存储在会话状态中的对象必须是可序列化的。 
(1)启动ASP.NET State Service服务 
(2)修改SessionState为如下 
<sessionState  mode="StateServer" timeout="10" stateConnectionString="tcpip=127.0.0.1:42424">    
</sessionState>
(3)重启web服务器,点击GetSession,session 10分钟内不会丢失,因为session存储服务器的另一个aspnet_state的进程里

c. sql server模式
描述:
如果是 SQL Server 模式,则存储在会话状态中的对象必须是可序列化的
默认情况 下,Aspnet_regsql.exe 工具将创建一个名为 ASPState 的数据库,该数据库包含支持 SQLServer 模式的存储过程。默认情况下,会话数据本身存储在 tempdb 数据库中。您可以选择使用 -sstype 选项来更改会话数据的存储位置。下表给出了 -sstype 选项可能的值:
t :将会话数据存储到 SQL Server tempdb 数据库中。这是默认设置。如果将会话数据存储到 tempdb 数据库中,重新启动 SQL Server 时将丢失会话数据。
p:将会话数据存储到 ASPState 数据库中,而不是存储到 tempdb 数据库中。
c :将会话数据存储到自定义数据库中。如果指定 c 选项,则还必须使用 -d 选项包括自定义数据库的名称。  
(1) 进入visual studio 2008(2005) command prompt
(2) 输入如下红色的命令

(3) 创建出如下数据库和表

(4) 运行页面,然后重启web服务,点击Get Session,session不会丢失,因为session保存到sql server数据库里了。

原文地址:http://blog.itpub.net/25897606/viewspace-712500/

.net Session 详解

时间: 2024-10-12 04:17:22

.net Session 详解的相关文章

PHP5 session 详解

http协议是WEB服务器与客户端(浏览器)相互通信的协议,它是一种无状态协议.所谓无状态,指的是不会维护http请求数据,http请求是独立的,非持久的.而越来越复杂的WEB应用,需要保存一些用户状态信息.这时候,Session这种方案应需而生.PHP从4.1开始支持Session管理. session是很抽象的一个概念.我们不妨先从与它几个息息相关的有迹可寻的小切入点入手,然后逐渐地认识了解它. session存储 首先,我们为什么需要Session,就是因为我们需要存储各个用户的状态数据.

Cookie与Session详解

来源:<PHP核心技术与最佳实践> 列旭松 陈文 著 Cookie与Session详解读书笔记,从概念.操作.应用.注意事项以及区别等几方面详细阐述两者的基础知识,它们都是针对HTTP协议的局限性而提出的一种保持客户端和服务器间保持会话连接状态的机制.. 一.Cookie详解 Cookie在远程浏览器端存储数据并以此跟踪和识别用户的机制.从实现上说,Cookie是存储在客户端上的一小段数据,浏览器(即客户端)通过HTTP协议和服务器端进行Cookie交互. Cooke独立于语言存在,严格地说,

.net的session详解 存储模式 存到数据库中 使用范围与大小限制 生命周期

Session又称为会话状态,是Web系统中最常用的状态,用于维护和当前浏览器实例相关的一些信息.举个例子来说,我们可以把已登录用户的用户名放在Session中,这样就能通过判断Session中的某个Key来判断用户是否登录,如果登录的话用户名又是多少. 我们知 道,Session对于每一个客户端(或者说浏览器实例)是"人手一份",用户首次与Web服务器建 立连接的时候,服务器会给用户分发一个 SessionID作为标识.SessionID是一个由24个字符组成的随机字符串.用户每次提

PHP5 session 详解【经典】

原文:http://www.pkwind.com/php5-session-xiang-jie-jing-dian http协议是WEB服务器与客户端 (浏览器)相互通信的协议,它是一种无状态协议.所谓无状态,指的是不会维护http请求数据,http请求是独立的,不持久的.而越来越复杂的WEB应 用,需要保存一些用户状态信息.这时候,Session这种方案应需而生.PHP从4.1开始支持Session管理. session是很抽象的一个概念.我们不妨先从与它几个息息相关的有迹可寻的小切入点入手,

PHP5 session 详解【经典】 -- 转帖

PHP5 session 详解[经典] http协议是WEB服务器与客户端(浏览器)相互通信的协议,它是一种无状态协议.所谓无状态,指的是不会维护http请求数据,http请求是独立的,非持久的.而越来越复杂的WEB应用,需要保存一些用户状态信息.这时候,Session这种方案应需而生.PHP从4.1开始支持Session管理. session是很抽象的一个概念.我们不妨先从与它几个息息相关的有迹可寻的小切入点入手,然后逐渐地认识了解它. session存储 首先,我们为什么需要Session,

javaEE session详解

1也可以记录状态信息,与cookie不同,cookie是记录在客户端的,session是记录在服务器端的. 2session是服务器哦开辟的一块内存,session是与浏览器(或子窗口)关联在一起的,其他浏览器访问不了. 3原理:在第一次访问服务器的时候,服务器会创建一个SessionID,会在服务器的Session内存里保存SessionID,然 后把这个SessionID通过response返回给浏览器(浏览器就获得了这个SessionID),在第二次访问服务器,浏览器通 过request提

Session详解与应用(java,js)

Session机制 在学习session之前,我们首先要了解一下保存在客户端的会话跟踪机制cookie-------cookie详解与应用 除了使用Cookie,Web应用程序中还经常使用Session来记录客户端状态.Session是服务器端使用的一种记录客户端状态的机制,使用上比Cookie简单一些,相应的也增加了服务器的存储压力. 1  什么是Session Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上.客户端浏览器访问

PHP session详解

session处理是所有的Web应用都必须面对的问题.PHP中对session有效期的处理,和其他的解决方案有着很大的不同,这是和PHP的工作机制相关的.    在传统的client/server应用中,对于session失效的情况,可以交给网络协议自己来处理.无论是client端主动关闭连接,还是因为网络异常而导致的连接中断,server端都能够得到通知,触发连接中断的事件.只要编程响应这一事件,执行指定的操作即可.    但对于web应用来说,情况却完全不一样.HTTP协议本身是无状态的,也

session详解

获的session对象的方式: 1.openSession 2.getCurrentSession 如果使用getCurrentSession需要在hibernate.cfg.xml文件中进行配置: 如果是本地事务(jdbc事务):<property name="hibernate.current_session_context_class">thread</property> 如果是全局事务(jta事务):<property name="hib