转:ASP.NET中的SESSION实现与操作方法

在ASP.NET中,状态的保持方法大致有:ApplicationState,SessionState,Cookie,配置文件,缓存。

  ApplicationState 的典型应用如存储全局数据。

  SessionState 的典型应用如购物车项目保存。

  Cookie 的典型应用如网站的个性化设置。

  配置文件 的典型应用如保存客户账户信息。

  缓存 的典型应用如保存从数据库获取的数据。

  相对来讲,最不安全的是Cookie,因为它存储在客户端,会被用户修改。其它另外几种都只是在服务端,从来没被传送到客户端,所以是安全的。但是对于

Session来说,因为涉及到一个SessionID的问题,如果不使用SSL(Secure Socket Layer)协议(https 就基于SSL)的话,可能发生 会话劫持问题。

  当然,上面提到的一个状态保持是一个比较广义的状态保持,真正能保持特定客户端的状态的,只有Cookie 与 Session 两种,当然其它基于登录用户的方式就不提了。

  今天我先只学习Session吧,前几天笔试时,Session 上吃了大亏。。。。。

  Session可以在服务器端保持一些信息,并且当一个特定的用户在一个特定的WebApp中的不同页面间跳转时,这个信息是可以共享的。所以,这种机制就常被拿来保存购物车信息,因为一个用户在一个电子商务站点,可能会依次浏览不同的商品页面,然后往里面加商品,刚好是针对同一用户的页面跳转信息保持,正好用Session实现。

   那么对于Server端来说,要标识一个特定的客户端,就要给客户端一个ID,叫做 SessionID 。这个东西要由服务端生成然后发送,存放在客户端,存放方式有两种,一种是客户端 Cookie ,另一种是附加在URL上。就是因为这个步骤,导致了前面所谓的会话劫持的风险。这种风险可由使用SSL传送来解决。

  关于SessionID,需要知道的是,它由HTTP REQUEST处理管道中的一个叫SessionStateModule的模块产生的 一个 120 位的标识符,并使用一个私有算法来生成的,保证了该值是唯一的且足够随机(当然是从统计学的角度来说)。因此从这儿可以看出,SessionID完全不用开发人员操心,那是ASP.NET服务解决的问题。

  接下来,系统提供了一个名叫 Session 的集合,可以直接进行读写操作,如下所示:

  写入:

    Session["SimpleString"] = "Hello Session!";

  在本页面,或者下一个页面中读取:

    string s = Session["SimpleString"].ToString();           //注意这儿要对集合元素进行类型转化。

  真是太简单了。。。。

  本着深入理解一样事物的原则,我当然要弄明白,这个Session倒底是个什么东西,以及这些Session信息,倒底是放在服务器上的哪儿的?

  1:Session 是 HttpContext 类的一个属性(Property),是一个HttpSessionState 类型的对象:

  public sealed class HttpContext : IServiceProvider

  {

    //...

    public HttpSessionState Session { get; }

    //...

  }

  既然它是一个HttpSessionState类型的对象,那我看看这个类倒底提供了哪些东西可用,查了下MSDN,有很多东西,但我想比较有趣的有:

  Session.Count    指示当前会话集合中的项目数。

  Session.SessionID  指示当前客户端会话的SessionID。

  IsCookieless     指示当前会话ID是存储在cookie中还是嵌入在URL中。

  Timeout         指示了当前会话要保存多长时间,因为客户端不会请求销毁Session数据,所以这些数据要等一定的时间后自动由服务端释放。

  Abandon()       使用该方法可以立即取消当前会话并释放它战胜的空间,在退出页面中它很有效,能够确保服务器资源最快得到回收。

  Clear()        该方法在不改变当前会话ID的情况下清空所有的会话项目。  

  2:Session数据也是由SessionStateModule这个模块来负责处理的,但它并不保存会话数据,数据是放在称做 SessionState Provider 的东西中的,有三种典型的Provider 方式: InProc ,StateServer ,SQLServer 。

  InProc: 设置为将Session存储在进程内,跟ASP中的存储方式一样,这是默认值。

  StateServer :设置为将Session存储在独立的状态服务中。

  SQLServer: 设置将Session存储在SQL Server中。

  我们一般默认使用InProc方式,这个配置是通过web.config来指定的,如下:

  <sessionState
  mode="InProc"
  stateConnectionString="tcpip=127.0.0.1:42424"
  sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"
  cookieless="false"
  timeout="20" 
  />

  

  这一个配置节的语法如下:

<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"/>

  另外两种存储方法要具体配置,参考下面的那篇列举的文章即可。

  最后一个学习点:Session信息什么情况下会不可用。

  1:用户关闭并重启浏览器,这时候再请求同一个页面,尽管Session仍然在,但是因为这次又生成了新的SessionID,所以旧的Session已经不可用了。

  2:用户通过另一个浏览器窗口访问在同一页面,这时候不同的浏览器有不同的处理方法,有些Session仍然可用,有些不可用。

  3:由于没有活动导致会话超时,默认情况下是20分钟闲置后就会超时。

  4:程序中调用了Session.Abandon()方法结束了会话。

  转自http://www.cnblogs.com/csharp4/archive/2010/06/11/1756010.html

时间: 2024-11-09 08:01:59

转:ASP.NET中的SESSION实现与操作方法的相关文章

asp.net中利用session对象传递、共享数据[session用法]

下面介绍Asp.net中利用session对象传递.共享数据用法: 1.传递值: 首先定义将一个文本值或单独一个值赋予session,如下: session["name"]=textbox1.text:将文本1的值赋给了session变量name,当调查到其它页面时,此值可以传递,依然存在,下面是调用或判断此值. If(session["name"]==null) {} Else { lable1.text=session["name"].tos

【转】asp.net中利用session对象传递、共享数据[session用法]

来自:http://blog.unvs.cn/archives/session-transfer-method.html 下面介绍Asp.net中利用session对象传递.共享数据用法: 1.传递值: 首先定义将一个文本值或单独一个值赋予session,如下: session["name"]=textbox1.text:将文本1的值赋给了session变量name,当调查到其它页面时,此值可以传递,依然存在,下面是调用或判断此值. If(session["name"

ASP.NET中的Session怎么正确使用

Session对象用于存储从一个用户开始访问某个特定的aspx的页面起,到用户离开为止,特定的用户会话所需要的信息.用户在应用程序的页面切换时,Session对象的变量不会被清除. 对 于一个Web应用程序而言,所有用户访问到的Application对象的内容是完全一样的:而不同用户会话访问到的Session对象的内容则各不相 同. Session可以保存变量,该变量只能供一个用户使用,也就是说,每一个网页浏览者都有自己的Session对象变量,即Session对象具有唯一 性. 什么是Sess

ASP.NET MVC中的Session以及处理方式

最近在ASP.NET MVC项目中碰到这样的情况:在一个controller中设置了Session,但在另一个controller的构造函数中无法获取该 Session,会报"System.NullReferenceException"错误.之所以这样做是因为希望在controller构造函数中获 取Session值并赋值给一个全局变量,好让该controller的多个action共享. 起先以为是ASP.NET State Service服务没有开启,或者是Web.config中se

温故而知新:Asp.Net中如何正确使用Session

原文链接作者:菩提树下的杨过出处:http://yjmyzz.cnblogs.com Asp.Net中的Session要比Asp中的Session灵活和强大很多,同时也复杂很多:看到有一些Asp.Net开发人员报怨说Session不稳定,莫名其妙的丢失,其实这正是Asp.Net改进的地方之一. 我们知道Session与Cookie最大的区别在于:Cookie信息全部存放于客户端,Session则只是将一个ID存放在客户端做为与服务端验证的标记,而真正的数据都是放在服务端的内存之中的. 在传统we

ASP.NET里的Session详细解释

Session模型简介 Session是什么呢?简单来说就是服务器给客户端的一个编号.当一台WWW服务器运行时,可能有若干个用户浏览正在运正在这台服务器上的网站.当每个用户首次与这台WWW服务器建立连接时,他就与这个服务器建立了一个Session,同时服务器会自动为其分配一个SessionID,用以标识这个用户的唯一身份.这个SessionID是由WWW服务器随机产生的一个由24个字符组成的字符串,我们会在下面的实验中见到它的实际样子. 这个唯一的SessionID是有很大的实际意义的.当一个用

c# webConfig中的session超时详细设置

webConfig中的session超时详细设置 我们在webConfig中设置Session超时的时候,如果最后发行的地址是远程服务器,我们很多不是必须的属性并不用设置,如果设之后,倒不能让 session超时奏效.我在做现在的程序的时候,就是这样,写sessionState的时候,按照如下的方式设置之后,session设置的 timeout时间不能够起作用:但是不用了一些属性之后,就能够起作用了. 服务器上发行后不能起作用的设置: <sessionState mode="InProc&

asp.net中session的原理及应用

Session简介丶特性 1.Session是一种Web会话中的常用状态之一. 2.Session提供了一种把信息保存在服务器内存中的方式.他能储存任何数据类型,包含自定义对象. 3.每个客户端的Seesion是独立存储的. 4.在整个会话过程中,只要SessionID的cookie不丢失,都会保存Session信息的. 5.Session不能跨进程访问,只能由该会话的用户访问.应为提取Session数据的id标识是以Cookie的方式保存到访问者浏览器的缓存里的. 6.当会话终止,或过期时,服

ASP.NET中Session的sessionState 4种mode模式

1. sessionState的4种mode模式 在ASP.NET中Session的sessionState的4中mode模式:Off.InProc.StateServer及SqlServer. 2. Off模式 <sessionState mode="Off"></sessionState> 关闭模式,即不需要使用Session. 单个页面关闭Session: <%@ Page EnableSessionState="false" %