获取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值后可进行其他公开信息进一步验证。其他公开信息比如:用户名或者用户编号。




如何使用SQLServer Session

最近开发项目,由于涉及到Session保持的问题,最终查了一下网络上的相关

数据库中存储Session信息

大部分使用PHP的人一旦应用到Session都会使用Cookie。Cookie虽好可是它也会给我们带来一些隐患。 隐患一: 如果客户端机器的Cookie一旦因病毒而失效了,那么Session信息也...

获取SQL Server 数据库中Session的值 .

在asp.net 中,session可存储于数据库,但怎样在其他应用中获取数据库存放session的值呢? 怎样把session存储在数据库中的参考文章 http://blog.csdn.net/o...

获取SQL Server 数据库中Session的值

在asp.net 中,session可存储于数据库,但怎样在其他应用中获取数据库存放session的值呢? 怎样把session存储在数据库中的参考文章 http://blog.csdn.net/o...
  • cui55
  • cui55
  • 2013年04月18日 15:18
  • 612

session 存储在 SQL Server中

  • 2014年02月12日 17:14
  • 81KB
  • 下载

SQL Server数据库学习之 -- 存储过程-游标-表值类型综合运用

我在公司工作中,根据项目中的需求,需要编写存储过程,进行对数据批量处理。考虑到对公司源码保密,对此,我简化了公司开发中编写存储过程的内容,以另一个场景将所运用到的知识写下来: USE [B2C2]...

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

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

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

SELECT sp.object_Id as FunctionId, sp.name as FunctionName, isnull(param.name,'')as Para...
  • whaxrl
  • whaxrl
  • 2016年04月14日 14:22
  • 802

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

在SQL Server 2005数据库中,想要获取某个表的创建时间,是今天我在百度问答中碰到的问题。本来还以为不能回答出来了,想不到在网上找找,自己试试,还真最终找到了解决问题的方法。从中也说明了,网...
  • yenange
  • yenange
  • 2011年08月24日 13:36
  • 1171

获取SQL Server数据库里表占用容量大小

SQL Server数据库中表是数据库中最为重要的对象,没有了表的存在,其他的对象就无从说起,可见表在SQL Server数据库中的地位,SQL Server数据库就好比是一个大仓库,那么如何来获取S...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:获取SQL Server 数据库中Session的值
举报原因:
原因补充:

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