博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一次性搞定Session
阅读量:5253 次
发布时间:2019-06-14

本文共 3872 字,大约阅读时间需要 12 分钟。

  相信很多人遇到过同一个浏览器会出现Session覆盖问题。今天主要针对Session覆盖问题来看看Session是如何工作的。那么先看一张简单的图说明一下

 

 上面的图大致的说明Session工作简单创建问题,下面详细来说明Session。

1:首先我们要知道一个概念那就是会话。什么是会话呢,其实可以理解私密谈话 1对1的关系。而浏览器请求服务器就是一个会话。但是有很多客户请求服务器,服务器怎么样来识别是哪一个客户发来的就是通过SessionId来识别。(一个浏览器请求服务器只产生一个SessionID也就是说一个浏览器请求服务器就是一个会话。)

2:开始请求服务器我们看下面一段代码

A:通过Session来保存用户信息

public class BasePage:Page {        ///         /// 事件以对页进行初始化。        ///         /// 其中包含事件数据        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("");                    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的信息就比较简单。

 

转载于:https://www.cnblogs.com/LipeiNet/p/4755103.html

你可能感兴趣的文章
ASP.NET WebApi 基于OAuth2.0实现Token签名认证
查看>>
283. Move Zeroes把零放在最后面
查看>>
Visual Studio Code 打开.py代码报Linter pylint is not installed解决办法
查看>>
Python 数据类型
查看>>
S5PV210根文件系统的制作(一)
查看>>
centos下同时启动多个tomcat
查看>>
slab分配器
查看>>
数据清洗
查看>>
【读书笔记】C#高级编程 第三章 对象和类型
查看>>
针对sl的ICSharpCode.SharpZipLib,只保留zip,gzip的流压缩、解压缩功能
查看>>
【转】代码中特殊的注释技术——TODO、FIXME和XXX的用处
查看>>
【SVM】libsvm-python
查看>>
C++循环单链表删除连续相邻重复值
查看>>
Jmeter接口压力测试,Java.net.BindException: Address already in use: connect
查看>>
ASP.NET使网页弹出窗口不再困难
查看>>
Leetcode Balanced Binary Tree
查看>>
Leetcode 92. Reverse Linked List II
查看>>
windown快速安装xgboost
查看>>
Linux上安装Libssh2
查看>>
九.python面向对象(双下方法内置方法)
查看>>