获取SQL Server 数据库中Session的值

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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值