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




asp.net session 保存在数据库中

/*********************************************************************  InstallSqlState.SQL         ...
  • tao19840705
  • tao19840705
  • 2011年02月09日 09:54
  • 233

SQL Server 得到SPID,唯一的sessionID

SQL Server 得到SPID,唯一的sessionID 用来查看哪些sessionID正在执行什么操作
  • fddqfddq
  • fddqfddq
  • 2014年05月23日 18:42
  • 7813

Session传值为空,终于解决了

Session传值为空,提示未将对象引用设置到对象的实例
  • cqunknown
  • cqunknown
  • 2008年01月11日 15:34
  • 854

获取SQL Server 数据库中Session的值

在asp.net 中,session可存储于数据库,但怎样在其他应用中获取数据库存放session的值呢? 怎样把session存储在数据库中的参考文章 http://blog.csdn.net/o...
  • ojekleen
  • ojekleen
  • 2012年03月21日 11:37
  • 4185

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

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

SQL Server获取和设置SEQUENCE

SQL Server设置自增的SEQUENCE, 有时候我们需要获取各式各样数据库自增的ID,但是SQLServer的自增列又不是所有都能满足需求,这时候想到自己书写一个自增的SEQUENCE 1...
  • moshansk
  • moshansk
  • 2017年04月12日 14:31
  • 944

oracle系统表v$session、v$sql字段说明

oracle系统表v$session、v$sql字段说明(转) (2011-07-21 16:12:47) 转载 标签: 杂谈 分类: Oracle ...
  • paluo
  • paluo
  • 2011年10月09日 00:47
  • 19210

v$session中user#为0或username为空时代表的意思

v$session USER#: session's user id。等于dba_users中的user_id。Oracle内部进程的user#为0。   USERNAME: session's...
  • haiross
  • haiross
  • 2013年12月31日 14:13
  • 3537

使用sqlserver来存放和取得session

asp.net 提供了三种存放 session的方式。1 InProc 2 State Server 3 SQL Server 第一种是我们经常用的,第2中就是使用一个名为 state server ...
  • 21aspnet
  • 21aspnet
  • 2004年10月24日 23:07
  • 2710

js中获取session中的值(jsp)

今天在项目中的时候需要在js中获取到session中的值,来确定用户的登陆状态,以及获取用户的具体信息。由于使用的是jsp开发,所以可以使用如下方式获取。 $(function() { var...
  • q5841818
  • q5841818
  • 2015年09月05日 08:34
  • 18794
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:获取SQL Server 数据库中Session的值
举报原因:
原因补充:

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