• ASP.NET Session原理及处理方法


    session是怎么存储,提取的

    1.在服务器端有一个session池,用来存储每个用户提交session中的数据,Session对于每一个客户端(或者说浏览器实例)是“人手一份”,用户首次与Web服务器建立连接的时候,服务器会给用户分发一个SessionID作为标识。SessionID是一个由24个字符组成的随机字符串。用户每次提交页面,浏览器都会把这个SessionID包含在HTTP头中提交给Web服务器,这样Web服务器就能区分当前请求页面的是哪一个客户端,而这个SessionID是一cookie的方式保存的在客户端的内存中的,如果想要得到Session池中的数据,服务器就会根据客户端提交的唯一SessionID标识给出相应的数据返回。

    Session池中每个客户端的数据是怎么存储的

    1.存储在Session池中的数据是全局型的数据,可以跨页面访问,每个SessionID中只存储唯一的数据,如:首先你这样设定:session["userName"]="admin",然后你在会话还没结束的session还没过期的情况下,你又设定:session["userName"]="123";这样这个SessionID没变,然而Session池中的数据则被覆盖。此时session["userName"]的值就是“123”,而不是其它。

    2.Session池中的数据不能跨进程访问。如:打开login.aspx页面写入session[“userName”]="admin";然后login页面不关闭,即此会话不结束,在这是你再在另外一个浏览器中打开一个login.aspx页面则session["userName"]=null

    3.输入账号密码,点击登录页面输出  “admin --- 点击登录” ,如果紧接着点击获取session按钮,则页面只输出"admin--- 点击获取session",如果页面不关闭,打开另外一个浏览器,点击获取session按钮,则页面没法应。

    session的声明周期与销毁

    1.session存储数据计时是滚动计时方式。具体是这样的,如果你打开写入session,从写入开始,此页面如果一直没有提交操作,则默认时间是20分钟,20分钟后session被服务器自动销毁,如过有提交操作,服务器会从提交后重新计时以此类推,直至设定时间内销毁。

    2.可以设置session的销毁时间。

    为什么需要Session

    ASP.NET页面是"无状态"的,这意味着每次向服务器发送一个请求,服务器都会生成一个该页面的实例。但有时候,我们希望在不同的页面之间共享信息,比如购物车、用户信息等,于是,ASP.NET为我们提供了一个服务端的Session机制。

    Session是如何工作的

    服务端的Session机制是基于客户端的,也就是说服务端的Session会保存每个客户端的信息到服务端内存中。具体过程是这样的:
    →客户端向服务端发出请求
    →服务端响应客户端,并针对该客户端创建Session和唯一的Session ID
    →把Session ID作为key, Session内容作为value,以键值对形式存储到Session State Provider中
    →客户端带着专属的Session ID再次向服务端请求
    →服务端的Session机制根据客户端的Session ID,从Session State Provider中取出内容返回给客户端

    优点:
    ● 跨页面维持用户状态、信息
    ● 使用方便,并且能存储任何类型
    ● 能保存每个客户端的信息
    ● 安全的、透明的

    缺点:
    ● 因为Session是保存在服务端的内存中的,随着客户端请求的增多,很有可能影响到性能
    ● 在Web.conig中,sessionState节点的mode属性,如果设置为"StateServer"或"SQLServer",就必须为存储到Session中的对象打上[Serializable]。这样在存储、读取Session的时候,不断地序列化和反序列化,也会影响到性能

    Session简介丶特性

    1.Session是一种Web会话中的常用状态之一。

    2.Session提供了一种把信息保存在服务器内存中的方式。他能储存任何数据类型,包含自定义对象。

    3.每个客户端的Seesion是独立存储的。

    4.在整个会话过程中,只要SessionID的cookie不丢失,都会保存Session信息的。

    5.Session不能跨进程访问,只能由该会话的用户访问。应为提取Session数据的id标识是以Cookie的方式保存到访问者浏览器的缓存里的。

    6.当会话终止,或过期时,服务器就清除Session对象。

    7.Session常用于保存登录用户的ID.

    8.Session保存的数据是跨页面全局型的。

    Session的Mode

    在Web.config中,sessionState节点有一个mode属性,它的属性值代表了Session的Mode。包括:
    ● InProc
    ● StateServer
    ● SQLServer
    ● Custom
    ● Off

    每一种Mode的设置,会影响到Session机制采用哪种Session State Provider。

    □ Off

    如果我们想让Session失效:

    <system.web>
    
        <sessionState mode="off" />
    
    </sytem.web>

    □ InProc

    这也是ASP.NET Session机制所选用的默认Mode,在该模式下,只保存当前应用程序域的数据。如果重启服务器,Session保存的数据会全部丢失。

    <system.web>
    
        <sessionState mode="InProc" timeout="30" />
    
    </system.web>

    表示Session的有效期是30分钟。对于一些小网站或者数据量不大的时候,选用这个模式是比较好的。

    优点:
    ● 由于是把Session数据保存在内存中的,所以,获取数据非常快
    ● 没有序列化和反序列化的要求

    缺点:
    ● 如果应用程序域被丢弃、重启,Session数据会丢失
    ● 数据量大的时候,消耗过多的内存,影响性能

    □ StateServer

    选用此选项,意味着把Session的工作交给了当前应用程序域之外的asp.net_state.exe服务,这是一个独立于IIS之外的Windows服务。如果想启动该服务,可以通过打开“控制面板--管理工具--服务”,找到ASP.NET State Service这个服务,将其设为自动启动。

    即使重启ASP.NET进程,Session依然有效,这是StateServer模式的优点。此模式的缺点是涉及过多的序列化和反序列化。

    <system.web>
    
        <sessionState mode="StateServer" stateConnectionSting="tcpip=127.0.0.1:42424" stateNetworkTimeout="40" />
    
    </sytem.web>

    ● 127.0.0.1 表示默认选用本机
    ● 42424 表示默认端口
    ● stateNetworkTimeout用来设置服务器响应、等待客户端请求的时间,默认是10秒,这里设置为40秒

    如果想修改StateServer的默认设置,可以在asp.net_state.exe对应的注册表中修改。

    □ SQLServer

    选用此模式,Session数据被序列化,并被保存到SQL Server数据库中。为了让Sql Server配合此模式,需要做如下:
    →查看版本位置,比如在:C:WindowsMicrosoft.NETFrameworkv4.0.30319
    →输入如下命令
    1

    -ssadd 表示在SQL Server中添加session state
    -sstype p 表示Persisted
    -S 表示服务器名
    -U 表示SQL Server用户名
    -P 表示SQL Server密码

    →如果一切顺利,出现如下提示
    2

    →数据库中多了ASPState数据库,Session数据将被保存到此数据库的相关表中
    3

    优点:
    ● 在重启IIS后,Session数据不会受影响
    ● 最安全的Session处理方式

    缺点:
    ● 处理相对缓慢
    ● 过多的序列化和反序列化

    □ Custom

    自定义Session机制,通过继承SessionStateStoreProviderBase类,实现ISessionIDManager接口,等等。

      Session的Event

    Session的事件有2个:Session_Start和Session_End。可以在global.asax全局文件中对这2个事件做处理。

    void Session_Start(object sender, EventArgs e) 
    
    {
    
        //TODO
    
    }
    
    void Session_End(object sender, EventArgs e) 
    
    {
    
        // TODO
    
    }
     
    session中保存的数据是在服务端的,而每个用户如进行登录操作,都要进行session数据写入,所以建议慎用session,就是少用。
     
  • 相关阅读:
    算法系列:杂项
    算法系列:
    Algo: Dynamic programming
    Algo:
    算法系列:XXX
    算法系列:量子计算与量子通信
    算法系列:Reservoir Sampling
    算法系列:CSAPP 推荐
    算法系列:
    算法系列:geometry
  • 原文地址:https://www.cnblogs.com/studydp/p/9045173.html
Copyright © 2020-2023  润新知