一次性搞定Session
2018-06-18 04:47:22来源:未知 阅读 ()
相信很多人遇到过同一个浏览器会出现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的信息就比较简单。
源码下载
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:自己实现简单的AOP(一)简介
- 如何用Spring Boot集成Ehcache缓存,教你三招搞定 2020-05-19
- 搞定JVM基本原理和面试题,看看这几本书妥妥够了! 2020-05-18
- 搞定JVM基本原理和面试题,看看这几本书妥妥够了! 2020-05-15
- 这一份MySQL书单,可以帮你搞定90%以上的面试题! 2020-05-13
- 你真的以为计算机网络不重要吗,这份书单帮你搞定相关面试题 2020-05-13
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash