一次性搞定Session

王朝学院·作者佚名  2016-08-27  
宽屏版  字体: |||超大  

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

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

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

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

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

publicclassBasePage:Page {///<summary>///事件以对页进行初始化。///</summary>///<param name="e">其中包含事件数据</param>PRotectedoverridevoidOnInit(EventArgs e)

{

}publicUserInfo GetUserInfo

{get{if(HttpContext.Current !=null&& HttpContext.Current.Session !=null&& HttpContext.Current.Session["userinfo"] !=null)returnHttpContext.Current.Session["userinfo"]asUserInfo;returnnull;

}set{if(HttpContext.Current !=null&& HttpContext.Current.Session !=null)

HttpContext.Current.Session["userinfo"] =value;

}

}

B:初始化用户信息

UserInfo userInfo =newUserInfo

{

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=newDataTable();

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的工具即可打开我的如下图

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();//清空sessionResponse.Redirect("/Login.aspx");

}

我们就判断是否存在SessionId如果存在就提示

总结:Session是根据SessionId来判断是否唯一。不同终端不同浏览器登录的Session不是同一个(以前我总是误解Session["UserInfo"]就应该所有用户共享),其他问题设置Session的信息就比较简单。

源码下载

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有