获取SQL Server 数据库中Session的值

原创 2012年03月21日 11:37:25

在asp.net 中,session可存储于数据库,但怎样在其他应用中获取数据库存放session的值呢?

怎样把session存储在数据库中的参考文章 http://blog.csdn.net/ojekleen/article/details/7377126 

现再展示数据库中存储session数据模型

      ASP.NET Session状态数据库数据模型
  1.ASPStateTempSessions表定义

列名 类型 描述
SessionId nvarchar(88) Session ID + application ID
Created datetime Date and time session was created (UTC)
Expires datetime Date and time session expires (UTC)
LockDate datetime UTC date and time session was locked
LockDateLocal datetime Local date and time session was locked
LockCookie int Lock ID
Timeout int Session timeout in minutes
Locked bit 1=Session locked, 0=Session not locked
SessionItemShort varbinary(7000) Serialized session state (if <= 7,000 bytes)
SessionItemLong image Serialized session state (if > 7,000 bytes)
Flags int Session state flags (1=Uninitialized session)

  2.ASPStateTempApplications表定义
列名 类型 描述
AppId int Application ID
AppName char(280) Application name

表aspstatetempsessions存储session具体信息 ,sessionitemshort或者sessionitemlong存储session序列化后的值。

session序列化状态后的值t在小于或等于7000字节的情况下存储在sessionitemshor字段,当session序列化状态后的值长于7000则存储于sessionitemlong字段中。sessionid为网站中的sessionid 加上 aspstatetempapplications中的appid, appid为标准8位,在数据库中的sessionid的后8位为appid.即substring(sessionid,1,8)与网站中sessionid比对就为相同, 当网站执行 Session.Abandon(); 后,aspstatetempsessions表中会自动删除相应数据行。

以下代码为根据网站sessionid查询aspstatetempsessions表获取session值。

 /// <summary>
    /// aspstatetempsessions表映射实体
    /// </summary>
    public class SSOSessionEntity
    {
        private string sessionId;
        private DateTime created;
        private DateTime expires;
        private DateTime lockDate;
        private DateTime lockDateLocal;
        private int lockCookie;
        private int timeOut;
        private bool locked;
        private byte[] sessionItemShort;
        private byte[] sessionItemLong;
        private int flags;

        public string SessionId
        {
            get { return this.sessionId; }
            set { this.sessionId = value; }
        }

        public DateTime Created
        {
            get { return this.created; }
            set { this.created=value; }
        }

        public DateTime Expires
        {
            get { return this.expires; }
            set { this.expires = value; }
        }

        public DateTime LockDate
        {
            get { return this.lockDate; }
            set { this.lockDate = value; }
        }

        public DateTime LockDateLocal
        {
            get { return this.lockDateLocal; }
            set { this.lockDateLocal = value; }
        }

        public int LockCooKie
        {
            get { return this.lockCookie; }
            set { this.lockCookie = value; }
        }

        public int TimeOut
        {
            get { return this.timeOut; }
            set { this.timeOut = value; }
        }

        public bool Locked
        {
            get { return this.locked; }
            set { this.locked = value; }
        }

        public byte[] SessionItemShort
        {
            get { return this.sessionItemShort; }
            set { this.sessionItemShort = value; }
        }

        public byte[] SessionItemLong
        {
            get { return this.sessionItemLong; }
            set { this.sessionItemLong = value; }
        }

        public int Flags
        {
            get { return this.flags; }
            set { this.flags = value; }
        }
    }

public interface ISessionDal
    {
        /// <summary>
        /// 通过sessionid获取实体,具体实现为查询数据库返回dbdatareader并赋值于实体实例
        /// sql: select * from dbo.ASPStateTempSessions where substring(sessionid,1,len(sessionid)-8)=@sessionid
        /// </summary>
        /// <param name="sessionId">sessionid</param>
        /// <returns>SSOSessionEntity实例</returns>
        SSOSessionEntity GetEntity(string sessionId);
    }

关键问题怎样把sessionitem反序列化。代码如下:

/// <summary>
        /// 通过key获取session
        /// </summary>
        /// <param name="sentity">SSOSessionEntity实例</param>
        /// <param name="sessionkey">Sesssin["sessionkey"]获取中的key</param>
        /// <returns>Session[""]获取的值,未类型转换</returns>
        public object GetSession(SSOSessionEntity sentity,string sessionkey)
        {
            object obj = null;

            System.IO.MemoryStream stream = new System.IO.MemoryStream();
            System.IO.BinaryReader reader = new System.IO.BinaryReader(stream);
            stream.SetLength(0);

            if (sentity.SessionItemShort != null)
                stream.Write(sentity.SessionItemShort, 0, sentity.SessionItemShort.Length);
            else
                stream.Write(sentity.SessionItemLong, 0, sentity.SessionItemLong.Length);

            stream.Seek(0, System.IO.SeekOrigin.Begin);
            reader.ReadInt32();
            bool bol_flag = reader.ReadBoolean();
            reader.ReadBoolean();
            if (bol_flag)
            {
                System.Web.SessionState.SessionStateItemCollection sessionItems = System.Web.SessionState.SessionStateItemCollection.Deserialize(reader);
                foreach (string key in sessionItems.Keys)//当前sessionid中所有session
                {
                    if (sessionkey.Equals(key))
                    {
                        obj = sessionItems[key];
                        break;
                    }
                }
            }

            return obj;
        }

在编写同域名单点登录时,可在登录点创建sessionid和其他可公开的验证信息的cookie,在其他二级域名验证是否登录时,可先获取cookie中sessionid及其他公开信息,查询数据库是否具有当前sessionid并进行比较,获取session值后可进行其他公开信息进一步验证。其他公开信息比如:用户名或者用户编号。




版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

查询数据库当前连接数(session),进程数等操作

查询数据库当前连接数(session),进程数等操作 查询当前数据库连接数,进程数,启动数据库 查询数据库当前进程的连接数:   select count(*) fr...

session 存储在 SQL Server中

  • 2014-02-12 17:14
  • 81KB
  • 下载

在SQL Server Oracle MySQL当数据库中查出某值为NULL怎么办?

NULL 值的三大特点,分别是:1)NULL值不参加统计;2)NULL值不进入计算表达式;3)不能与其它值进行比较。 所谓NULL值不参加统计 即 在使用统计函数时,凡是涉及到 NULL值的都会被忽...

在.NET中根据SQL Server系统表获取数据库管理信息

最近在做一些数据库管理维护方面的开发,需要了解一些有关数据库的管理信息,比如本机上运行了哪些数据库服务器实例,局域网内运行了哪些数据库服务器实例及每个数据库服务器下有多少数据库,每个数据库的物理文件大...

SQL SERVER数据库复制中出现logread代理失败的错误日志获取及分析办法

经常在复制的过程中遇到快照不成功或者读日志不成功的情况 。如下图所示:为一种典型的logread失败的情况 ,但遇到这种情况光靠图形界面和作业的信息看不出什么细节来,一般可跟踪问题的原因可以通过以下对...

SQL Server 获取数据库表的元信息

今天使用数据库时,想看一下最新生成的表结构,发现自己这方面的知识简直就是空白,但是我觉得设计数据库的人应该会提供生成表的结构的元信息,所以网上搜一下,发现很多都是使用sysobjects这个系统提供的...

SQL Server 通过JOB来定期获取数据库相关性能数据—JOB介绍

今天公司DBA提供了一套脚本,方便在SQL Server中利用JOB来获取性能相关数据,网上翻了下,找到两篇不错的JOB相关说明,链接如下: SQL SERVER 中如何用脚本管理作业:http:/...

获取sql server数据库中所有用户表名

http://www.cnblogs.com/justwannaloveyou/archive/2010/11/09/1873021.html 获取sql server数据库中所有用户表名及在sql...

SQL SERVER如何获取指定数据库中所有存储过程的参数

SELECT sp.object_Id as FunctionId, sp.name as FunctionName, isnull(param.name,'')as Para...

SQL Server 2005数据库中,获取某个表的创建时间

在SQL Server 2005数据库中,想要获取某个表的创建时间,是今天我在百度问答中碰到的问题。本来还以为不能回答出来了,想不到在网上找找,自己试试,还真最终找到了解决问题的方法。从中也说明了,网...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)