仓酷云

标题: ASP.NET网站制作之[ASP.NET] Session 详解 [打印本页]

作者: 变相怪杰    时间: 2015-1-16 22:31
标题: ASP.NET网站制作之[ASP.NET] Session 详解
就安全性而言,Java已经远远低于VB.NET,更无法与安全性著称的C#相比。asp.net|session|详解浏览本文章之前的筹办

  浏览本文章前,必要读者对以下常识有所懂得。不然,浏览过程当中会在响应的内容上碰到分歧水平的成绩。

  明白ASP/ASP.NET编程
  懂得ASP/ASP.NET的Session模子
  懂得ASP.NETWeb使用程序模子
  懂得ASP.NETWeb使用程序设置文件Web.config的感化、意义及利用办法
  懂得InternetInformationServices(以下简称IIS)的基础利用办法
  懂得怎样在MicrosoftSQLServer中创立一个数据库。


Session模子简介

  Session是甚么呢?复杂来讲就是服务器给客户真个一个编号。当一台WWW服务器运转时,大概有多少个用户扫瞄正在运正在这台服务器上的网站。当每一个用户初次与这台WWW服务器创建毗连时,他就与这个服务器创建了一个Session,同时服务器会主动为其分派一个SessionID,用以标识这个用户的独一身份。这个SessionID是由WWW服务器随机发生的一个由24个字符构成的字符串,我们会鄙人面的实行中见到它的实践模样。

  这个独一的SessionID是有很年夜的实践意义的。当一个用户提交了表单时,扫瞄器会将用户的SessionID主动附加在HTTP头信息中,(这是扫瞄器的主动功效,用户不会发觉到),当服务器处置完这个表单后,将了局前往给SessionID所对应的用户。试想,假如没有SessionID,当有两个用户同时举行注册时,服务器如何才干晓得究竟是哪一个用户提交了哪一个表单呢。固然,SessionID另有良多其他的感化,我们会在前面说起到。

  除SessionID,在每一个Session中还包括良多其他信息。可是关于编写ASP或ASP.NET的程序与来讲,最有效的仍是能够经由过程会见ASP/ASP.NET的内置Session工具,为每一个用户存储各自的信息。比方我们想懂得一下会见我们网站的用户扫瞄了几个页面,我们大概在用户大概会见到每一个的页面中到场:

程序代码:<%
IfSession("PageViewed")=""Then
 Session("PageViewed")=1
Else
 Session("PageViewed")=Session("PageViewed")+1
EndIf
%>

  经由过程以下这句话可让用户得知本人扫瞄了几个页面:

程序代码:<%
Response.Write("Youhaveviewed"&Session("PageViewed")&"pages")
%>

  大概有些有些读者会问:这个看似像是数组的Session(“..”)是那里来的?必要我界说吗?实践上,这个Session工具是具有ASP注释才能的的WWW服务器的内建工具。也就是说ASP的体系中已给你界说好了这个工具,你只必要利用就好了。个中Session(“..”)中的..就仿佛变量称号,Session(“..”)=$$中的$$就是变量的值了。你只必要写上句话,在这个用户的每一个页面中都能够会见..变量中的值了。

  实在ASP一共内建了7个工具,有Session、Application、Cookie、Response、Request、Server等。在其他的服务器端剧本言语如JSP、PHP等中也有其相似的工具,只是叫法大概利用办法上不太一样。

ASPSession的功效的缺点

  今朝ASP的开辟职员都正在利用Session这一壮大的功效,可是在他们利用的过程当中却发明了ASPSession有以下缺点:

  历程依附性:ASPSession形态存于IIS的历程中,也就是inetinfo.exe这个程序。以是当inetinfo.exe历程溃散时,这些信息也就丧失。别的,重起大概封闭IIS服务城市形成信息的丧失。
  Session形态利用局限的范围性:刚一个用户从一个网站会见到别的一个网站时,这些Session信息其实不会随之迁徙已往。比方:新浪网站的WWW服务器大概不止一个,一个用户登录以后要往各个频道扫瞄,可是每一个频道都在分歧的服务器上,假如想在这些WWW服务器共享Session信息怎样办呢?
Cookie的依附性:实践上客户真个Session信息是存储与Cookie中的,假如客户端完整禁用失落了Cookie功效,他也就不克不及享用到了Session供应的功效了。
鉴于ASPSession的以上缺点,微软的计划者们在计划开辟ASP.NETSession时举行了响应的改善,完整克制了以上缺点,使得ASP.NETSession成了一个加倍壮大的功效。

Web.config文件简介

  有的ASP.NET程序员说:Web.config文件?我历来没有传闻过啊,但是我写的程序不是也能很一般的运转吗?是的,你说得没错,没有Web.config文件程序是能够一般运转的。可是,假如你做了一个年夜型的网站,必要对全部网站做一些全体设置,比方全部网站的页面利用何种言语编写的、网站的平安认证形式、Session信息存储体例等,这时候你就必要利用Web.config文件了。固然Web.config文件中的某些选项是能够经由过程IIS设置的,可是假如在Web.config中也有响应的设置就会掩盖失落IIS中的设置。并且,Web.config文件的最年夜的便当的地方就是能够在ASP.NET页面中经由过程挪用System.web名字空间会见Web.config中的设置。

  Web.config有两种,分离是服务器设置文件和Web使用程序设置文件,他们都名为Web.config。在这个设置文件中会保留以后IIS服务器中网页的利用哪一种言语编写的、使用程序平安认证形式、Session信息存储体例的一系列信息。这些信息是利用XML语法保留的,假如想对其编纂,利用文本编纂器就好了。

  个中服务器设置文件会对IIS服务器下一切的站点中的一切使用程序起感化。在.NETFramework1.0中,服务器的Web.config文件是存在:WinNTMicrosoft.NETFrameworkv1.0.3705中的。

  而Web使用程序设置文件Web.config则保留在各个Web使用程序中。比方:以后网站的根目次Inetpubwwwroot,而以后的Web使用程序为MyApplication,则Web使用程序根目次就应为:InetpubwwwrootMyApplication。假如你的网站有且只要一个Web使用程序,一样平常说来使用程序的根目次就是Inetpubwwwroot。假如想增加一个Web使用程序,在IIS中增加一个具有使用程序肇端点的假造目次就好了。这个目次下的文件及目次将被视为一个Web使用程序。可是,如许经由过程IIS增加Web使用程序是不会为你天生Web.config文件的。假如想创立一个带有Web.config文件的Web使用程序,必要利用VisualStudio.NET,新建一个Web使用程序项目。

  Web使用程序的设置文件Web.config是可选的,无关紧要。假如没有,每一个Web使用程序会利用服务器的Web.config设置文件。假如有,则会掩盖服务器Web.config设置文件中响应的值。

  在ASP.NET中,Web.config修正保留后会主动立即效果,不必再像ASP中的设置文件修正后必要从头启动Web使用程序才干失效了。

Web.config文件中的Session设置信息

  翻开某个使用程序的设置文件Web.config后,我们会发明以下这段:

程序代码:<sessionState
  mode="InProc"
  stateConnectionString="tcpip=127.0.0.1:42424"
  sqlConnectionString="datasource=127.0.0.1;Trusted_Connection=yes"
  cookieless="false"
  timeout="20"
/>

  这一段就是设置使用程序是怎样存储Session信息的了。我们以下的各类操纵次要是针对这一段设置睁开。让我们先看看这一段设置中所包括的内容的意义。sessionState节点的语法是如许的:

程序代码:<sessionStatemode="Off|InProc|StateServer|SQLServer"
cookieless="true|false"
timeout="numberofminutes"
stateConnectionString="tcpip=server:port"
sqlConnectionString="sqlconnectionstring"
stateNetworkTimeout="numberofseconds"
/>

必需有的属性是

属性选项形貌
mode设置将Session信息存储到那里
Off设置为不利用Session功效
InProc设置为将Session存储在历程内,就是ASP中的存储体例,这是默许值。
StateServer设置为将Session存储在自力的形态服务中。
SQLServer设置将Session存储在SQLServer中。

可选的属性是:

属性选项形貌
cookieless设置客户真个Session信息存储到那里
ture利用Cookieless形式
false利用Cookie形式,这是默许值。
timeout设置经由几分钟后服务器主动保持Session信息。默许为20分钟
stateConnectionString设置将Session信息存储在形态服务中时利用的服务器称号和端标语,比方:"tcpip=127.0.0.1:42424”。当mode的值是StateServer是,这个属性是必须的。
sqlConnectionString设置与SQLServer毗连时的毗连字符串。比方"datasource=localhost;IntegratedSecurity=SSPI;InitialCatalog=northwind"。当mode的值是SQLServer时,这个属性是必须的。
stateNetworkTimeout设置当利用StateServer形式存储Session形态时,经由几秒余暇后,断开Web服务器与存储形态信息的服务器的TCP/IP毗连的。默许值是10秒钟。

ASP.NET中客户端Session形态的存储
  在我们下面的Session模子简介中,人人能够发明Session形态应当存储在两个中央,分离是客户端和服务器端。客户端只卖力保留响应网站的SessionID,而其他的Session信息则保留在服务器端。在ASP中,客户真个SessionID实践是以Cookie的情势存储的。假如用户在扫瞄器的设置当选择了禁用Cookie,那么他也就没法享用Session的便当的地方了,乃至形成不克不及会见某些网站。为懂得决以上成绩,在ASP.NET中客户真个Session信息存储体例分为:Cookie和Cookieless两种。

  ASP.NET中,默许形态下,在客户端仍是利用Cookie存储Session信息的。假如我们想在客户端利用Cookieless的体例存储Session信息的办法以下:

  找到以后Web使用程序的根目次,翻开Web.Config文件,找到以下段落:

程序代码:<sessionState
  mode="InProc"
  stateConnectionString="tcpip=127.0.0.1:42424"
  sqlConnectionString="datasource=127.0.0.1;Trusted_Connection=yes"
  cookieless="false"
  timeout="20"
/>

  这段话中的cookieless="false"改成:cookieless="true",如许,客户真个Session信息就不再利用Cookie存储了,而是将其经由过程URL存储。封闭以后的IE,翻开一个新IE,从头会见方才的Web使用程序,就会看到相似上面的模样:






  个中,http://localhost/MyTestApplication/(ulqsek45heu3ic2a5zgdl245)/default.aspx中黑体标出的就是客户真个SessionID。注重,这段信息是由IIS主动加上的,不会影响之前一般的毗连。

ASP.NET中服务器端Session形态的存储

筹办事情

  为了您能更好的体验到实行征象,您能够创建一个叫做SessionState.aspx的页面,然后把以下这些代码增加到<body></body>中。

程序代码:<scriptrunat="server">
SubSession_Add(senderAsObject,eAsEventArgs)
 Session("MySession")=text1.Value
 span1.InnerHtml="Sessiondataupdated!<P>Yoursessioncontains:<fontcolor=red>"&
          Session("MySession").ToString()&"</font>"
EndSub

SubCheckSession(senderAsObject,eAsEventArgs)
 If(Session("MySession")IsNothing)Then
   span1.InnerHtml="NOTHING,SESSIONDATALOST!"
 Else
   span1.InnerHtml="Yoursessioncontains:<fontcolor=red>"&
            Session("MySession").ToString()&"</font>"
EndIf
EndSub
</script>
<formrunat="server"id="Form2">
 <inputid="text1"type="text"runat="server"name="text1">
 <inputtype="submit"runat="server"OnServerClick="Session_Add"
     value="AddtoSessionState"id="Submit1"name="Submit1">
 <inputtype="submit"runat="server"OnServerClick="CheckSession"
     value="ViewSessionState"id="Submit2"name="Submit2">
</form>
<hrsize="1">
<fontsize="6"><spanid="span1"runat="server"/></font>

  这个SessionState.aspx的页面能够用来测试在以后的服务器上是不是丧失了Session信息。

将服务器Session信息存储在历程中

  让我们往返到Web.config文件的方才那段段落中:

程序代码:<sessionState
  mode="InProc"
  stateConnectionString="tcpip=127.0.0.1:42424"
  sqlConnectionString="datasource=127.0.0.1;Trusted_Connection=yes"
  cookieless="false"
  timeout="20"
/>

  当mode的值是InProc时,申明服务器正在利用这类形式。

  这类体例和之前ASP中的形式一样,就是服务器将Session信息存储在IIS历程中。当IIS封闭、重起后,这些信息城市丧失。可是这类形式也有本人最年夜优点,就是功能最高。应为一切的Session信息都存储在了IIS的历程中,以是IIS可以很快的会见到这些信息,这类形式的功能比历程外存储Session信息或是在SQLServer中存储Session信息都要快上良多。这类形式也是ASP.NET的默许体例。

  好了,如今让我们做个实验。翻开方才的SessionState.aspx页面,任意输出一些字符,使其存储在Session中。然后,让我们让IIS重起。注重,并非使以后的站点中断再入手下手,而是在IIS中本机的呆板名的节点上点击鼠标右键,选择从头启动IIS。(想现在利用NT4时,从头启动IIS必需要从头启动盘算机才行,微软真是@#$%^&)前往到SessionState.aspx页面中,反省方才的Session信息,发明信息已丧失了。

将服务器Session信息存储在历程外

  起首,让我们来翻开办理工具->服务,找到名为:ASP.NETStateService的服务,启动它。实践上,这个服务就是启动一个要保留Session信息的历程。启动这个服务后,你能够从Windows义务办理器->历程中看到一个名为aspnet_state.exe的历程,这个就是我们保留Session信息的历程。

  然后,回到Web.config文件中上述的段落中,将mode的值改成StateServer。保留文件后的从头翻开一个IE,翻开SessionState.aspx页面,保留一些信息到Session中。这时候,让我们重起IIS,再回到SessionState.aspx页面中检察方才的Session信息,发明没有丧失。

  实践上,这类将Session信息存储在历程外的体例不但指能够将信息存储在本机的历程外,还能够将Session信息存储在其他的服务器的历程中。这时候,不但必要将mode的值改成StateServer,还必要在stateConnectionString中设置响应的参数。比方你的盘算你是192.168.0.1,你想把Session存储在IP为192.168.0.2的盘算机的历程中,就必要设置成如许:stateConnectionString="tcpip=192.168.0.2:42424"。固然,不要健忘在192.168.0.2的盘算机中装上.NETFramework,而且启动ASP.NETStateServices服务。

将服务器Session信息存储在SQLServer中

  起首,仍是让我们来做一些筹办事情。启动SQLServer和SQLServer代办署理服务。在SQLServer中实行一个叫做InstallSqlState.sql的剧本文件。这个剧本文件将在SQLServer中创立一个用来专门存储Session信息的数据库,及一个保护Session信息数据库的SQLServer代办署理功课。我们能够在以下路径中找到谁人文件:

程序代码:[systemdrive]winntMicrosoft.NETFramework[version]

  然后翻开查询剖析器,毗连到SQLServer服务器,翻开方才的谁人文件而且实行。稍等半晌,数据库及功课就创建好了。这时候,你能够翻开企业办理器,看到新增了一个叫ASPState的数据库。可是这个数据库中只是些存储历程,没有效户表。实践上Session信息是存储在了tempdb数据库的ASPStateTempSessions表中的,别的一个ASPStateTempApplications表存储了ASP中Application工具信息。这两个表也是方才的谁人剧本创建的。别的检察办理->SQLServer代办署理->功课,发明也多了一个叫做ASPState_Job_DeleteExpiredSessions的功课,这个功课实践上就是每分钟往ASPStateTempSessions表中删除过时的Session信息的。

  接着,我们前往到Web.config文件,修正mode的值改成SQLServer。注重,还要同时修正sqlConnectionString的值,格局为:

程序代码:sqlConnectionString="datasource=localhost;IntegratedSecurity=SSPI;"

  个中datasource是指SQLServer服务器的IP地点,假如SQLServer与IIS是一台机子,写127.0.0.1就好了。IntegratedSecurity=SSPI的意义是利用Windows集成身份考证,如许,会见数据库将以ASP.NET的身份举行,经由过程云云设置,可以取得比利用userid=sa;password=口令的SQLServer考证体例更好的平安性。固然,假如SQLServer运转于另外一台盘算机上,你大概会必要经由过程ActiveDirectory域的体例来保护双方考证的分歧性。

  一样,让我们做个实验。向SessionState.aspx中增加Session信息,这时候发明Session信息已存在SQLServer中了,即便你重起盘算机,方才的Session信息也不会丧失。如今,你已完整瞥见了Session信息究竟是甚么模样的了,并且又是存储在SQLServer中的,无能甚么就看你的发扬了,哈哈。

总结

  经由过程这篇文章,你能够看到在Session的办理和保护上,ASP.NET比ASP有了很年夜的前进,我们能够加倍随便的选择合适的办法了。关于企业级的使用来讲,这无疑关于服务器的同步、服务器的不乱性、牢靠性都是有益的。信任在壮大的微软撑持下,新一代的电子商务平台将会搭建的更好!

  同时,人人也会发明,在这个全部手艺中包含了操纵体系、Web服务及数据库多种手艺的整合。我信任,大概Windows没有Unix不乱,IIS没有Apache不乱,SQLServer也没有Oracle壮大,可是,谁能够将他们云云完善的联动到一同呢?以是说,固然微软每方面都不是太强,可是假如把微软的器材都整合到一同,谁敢说他不壮大呢?微软就是微软!
它有很多缺点的,有兴趣可以到网上去搜索一下。于是微软有发明了“下一代”C++:C++/CLI语言,这个可以解决在.NETFramework中,托管C++产生的问题。在《程序员》杂志上,lippman和李建中合作连载介绍了C++/CLI语言。
作者: 飘飘悠悠    时间: 2015-1-18 12:13
asp.net空间的支持有:ASP.NET1.1/虚拟目录/MicrosoftFrontPage2000扩展/CDONTS,同时他的网站上也提供了Asp.net的使用详解和程序源代码,相信对使用ASP.NET编程的程序员来说会非常有用哦!
作者: 爱飞    时间: 2015-1-21 22:39
业务逻辑代码都不必做任何改动;继承性和多态性使得代码的可重用性大大提高,你可以通过继承已有的对象最大限度保护你以前的投资。并且C#和C++、Java一样提供了完善的调试/纠错体系。
作者: 蒙在股里    时间: 2015-1-30 22:47
当然我们在选择Asp.net主机是,除了要考虑服务提供商在版本是否是实时更新以外,机房的环境和配置也是非常重要的,通常选择骨干网的机房,在速度和稳定性上会非常有保证。
作者: 透明    时间: 2015-2-6 16:29
Asp.net脚本的出现,为ASP空间带来了更高的稳定性,同时也为程序员建站提供更高环境!
作者: 山那边是海    时间: 2015-2-17 06:46
我觉得什么语言,精通就好,你要做的就是比其他80%的人都厉害,你就能得到只有20%的人才能得到的高薪。
作者: 分手快乐    时间: 2015-3-5 17:08
业务逻辑代码都不必做任何改动;继承性和多态性使得代码的可重用性大大提高,你可以通过继承已有的对象最大限度保护你以前的投资。并且C#和C++、Java一样提供了完善的调试/纠错体系。
作者: admin    时间: 2015-3-12 10:48
有一丝可惜的是,这个系列太强了,Java阵营的朋友根本就是哑口无言...争论之火瞬间被浇灭,这不是我想这么早就看到的,但是值了。
作者: 再现理想    时间: 2015-3-19 20:50
通过这次激烈的讨论,我从大家身上学到了太多,开阔了眼界,不管是支持我的还是骂我的,都感谢你们。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2