一次性搞定Session


  相信很多人遇到過同一個瀏覽器會出現Session覆蓋問題。今天主要針對Session覆蓋問題來看看Session是如何工作的。那么先看一張簡單的圖說明一下

 

 上面的圖大致的說明Session工作簡單創建問題,下面詳細來說明Session。

1:首先我們要知道一個概念那就是會話。什么是會話呢,其實可以理解私密談話 1對1的關系。而瀏覽器請求服務器就是一個會話。但是有很多客戶請求服務器,服務器怎么樣來識別是哪一個客戶發來的就是通過SessionId來識別。(一個瀏覽器請求服務器只產生一個SessionID也就是說一個瀏覽器請求服務器就是一個會話。)

2:開始請求服務器我們看下面一段代碼

A:通過Session來保存用戶信息

    public class BasePage:Page {
        /// <summary>
        /// 事件以對頁進行初始化。
        /// </summary>
        /// <param name="e">其中包含事件數據</param>
        protected override void OnInit(EventArgs e)
        {
            
        }

        public UserInfo GetUserInfo
        {
            get {
                if (HttpContext.Current != null && HttpContext.Current.Session != null && HttpContext.Current.Session["userinfo"] != null)
                    return HttpContext.Current.Session["userinfo"] as UserInfo;
                return null;
            }

            set {
                if (HttpContext.Current != null && HttpContext.Current.Session != null)
                    HttpContext.Current.Session["userinfo"] = value;
            }
        }

B:初始化用戶信息

    UserInfo userInfo = new UserInfo
            {
             UserName = txt_UserName.Text,
             Age = txt_Age.Text,
             RealName = txt_RealName.Text,
             XueXiao = txt_XueXiao.Text,
             GetSessionId = HttpContext.Current.Session.SessionID
            };            
            GetUserInfo = userInfo;
            Response.Redirect("/Index.aspx");

C:顯示用戶的信息

if (!IsPostBack)
            {
                DataTable dataTable = new DataTable();

                dataTable.Columns.Add("UserName", typeof(string));  
                dataTable.Columns.Add("Age", typeof(string));
                dataTable.Columns.Add("RealName", typeof(string));
                dataTable.Columns.Add("XueXiao", typeof(string));
                dataTable.Columns.Add("GetSessionId", typeof(string));

                if (GetUserInfo==null)
                {
                    Response.Redirect("/Login.aspx");
                }
                UserInfo userInfo = GetUserInfo;
                
                DataRow dr = dataTable.NewRow();
                dr["UserName"] = userInfo.UserName;
                dr["Age"] = userInfo.Age;
                dr["RealName"] = userInfo.RealName;
                dr["XueXiao"] = userInfo.XueXiao;
                dr["GetSessionId"] = userInfo.GetSessionId;
                dataTable.Rows.Add(dr);

                gv_UserInfo.DataSource = dataTable;
                gv_UserInfo.DataBind();
}

看下效果:IE瀏覽器用戶1

 

同一個IE瀏覽器用戶2

記得同一個瀏覽器 可以看出他們具有相同的SessionId也就表示他們是同一個會話這樣就會造成在次打開用戶1登錄的時候也發現是用戶2的信息(不做演示了)

如果在不同瀏覽器呢我們在看在谷歌瀏覽器輸入用戶3看運行結果

我們發現在另一個瀏覽器登錄SessionId變了,說明同一台終端不同瀏覽器表示不同會話,而相同瀏覽器是同一個會話

3:既然SessionId存在本地它如何進行和服務器交互的呢,下面我看一下圖

我們看的處當瀏覽器請求服務器的時候把SessionId傳了進去,然后服務器就開始匹配有沒有這個Session,如果沒有就創建一個Session同時又把SessionId傳回給瀏覽器保存在本地cookie中反之不創建

補充看一下Session的保存位置:在谷歌瀏覽器輸入chrome://settings/然后選擇內容設置然后找到所有cookie和網站數據打開就可以看到你剛剛運行以后產生的SessionId(由於是補充所以和上述SessionId不同)如圖

 

SessionId存在硬盤的位置是:C:\Users\Administrator\AppData\Local\Google\Chrome\User Data\Default 下載一款打開cookies的工具(ChromeCookiesView)即可打開我的如下圖

 

4:Session的默認清除的時間是20分鍾,如果我們關閉網頁會立即清除Session嗎?答案是否定,當關閉網頁的時候服務器的Session依然存在。

5:最后一點,關於Session在同一個瀏覽器覆蓋,如果用了Session技術那么就不准在同一個終端同一個瀏覽器去登錄兩個不同的用戶,如果要登錄則必須退出先登錄的用戶

看一下主要代碼

if (GetUserInfo!=null)
            {
                if (GetUserInfo.GetSessionId == HttpContext.Current.Session.SessionID)
                {

                    Response.Write("<Script Language=JavaScript>alert('已經有用戶登錄請退出然后在登錄!');</Script>");
                    return;
                }                
            }

退出代碼

    if (HttpContext.Current.Session!=null)
            {
                HttpContext.Current.Session.Abandon();//結束會話
                HttpContext.Current.Session.Clear();//清空session
                Response.Redirect("/Login.aspx");
            }

 

我們就判斷是否存在SessionId如果存在就提示

總結:Session是根據SessionId來判斷是否唯一。不同終端不同瀏覽器登錄的Session不是同一個(以前我總是誤解Session["UserInfo"]就應該所有用戶共享),其他問題設置Session的信息就比較簡單。

源碼下載

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM