zoukankan      html  css  js  c++  java
  • 一次性搞定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:UsersAdministratorAppDataLocalGoogleChromeUser DataDefault 下载一款打开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的信息就比较简单。

    源码下载

  • 相关阅读:
    C# 读取sqlite文件
    MongoDB聚合管道
    提取Word里的文本内容 C#
    Two Sum【LeetCode】
    Could not create SSL/TLS secure channel.
    处理Task引发的异常
    https请求抛出异常
    hexo+github page +markdown问题汇总
    通过自定义比较器排序(C#版)
    GridView固定行宽,自动换行,鼠标放在Table的Tr上变色
  • 原文地址:https://www.cnblogs.com/LipeiNet/p/4755103.html
Copyright © 2011-2022 走看看