一次性搞定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的信息就比较简单。
一次性搞定Session的更多相关文章
- 【项目实践】一文带你搞定Session和JWT的登录认证方式
以项目驱动学习,以实践检验真知 前言 登录认证,估计是所有系统中最常见的功能了,并且也是最基础.最重要的功能.为了做好这一块而诞生了许多安全框架,比如最常见的Shiro.Spring Security ...
- 【C语言】超详讲解☀️指针是个什么针?(一次性搞定指针问题)
目录 前言 一. 什么是指针? 引例 计算机是怎么对内存单元编号的呢? 内存空间的地址如何得到 想存地址怎么办? 本质目的不是为了存地址 二.指针和指针类型 为什么有不同类型的指针 1.指针的解引 ...
- Spring Boot 一个依赖搞定 session 共享,没有比这更简单的方案了!
有的人可能会觉得题目有点夸张,其实不夸张,题目没有使用任何修辞手法!认真读完本文,你就知道松哥说的是对的了! 在传统的单服务架构中,一般来说,只有一个服务器,那么不存在 Session 共享问题,但是 ...
- SpringBoot一个依赖搞定session共享
原文:微信公众号:Java开发宝典 https://mp.weixin.qq.com/s/_VFY9lXqNhH8Nh4HC9tuMg 1. 前言 在传统的单服务架构中,一般来说,只有一个服务器,那 ...
- 深入探讨C#中Socket一次性搞定消息发送
转载自:http://tech.chinaunix.net/a2010/0909/1101/000001101396.shtml [IT168 技术文档]最近浏览了几篇有关Socket发送消息 ...
- 轻松几句搞定【Javascript中的this指向】问题
this关键字在JavaScript中扮演了至关重要的角色,每次它的出现都伴随着它的指向问题,这也是很多初学者容易出错的地方. 不过,这篇文章将会带你一次性搞定this指向的问题,望能给大家提供帮助! ...
- DEV设计之自动流水号,DEV专家解答,自己折腾了半天也没有搞定,怪英文不好
() 老外专家给了回答,结果没有全到懂,又折腾了20分钟朋友提示才搞定 获取一个自动增加1的流水号值, 第一个参数是本事的数据库连接对象,第2个参数是也这个值为唯一标识返回来一个增量的值,第三个好像没 ...
- 如何使用 APM 搞定 PHP 应用的性能优化?
APM 究竟是什么? 很多人都是第一次听说 APM 的概念,本文主要阐述如何使用 APM 的解决方案来实现 PHP 应用性能的优化.首先先介绍一下 APM (Application Performan ...
- 转:C4项目中验证用户登录一个特性就搞定
转:C4项目中验证用户登录一个特性就搞定 在开发过程中,需要用户登陆才能访问指定的页面这种功能,微软已经提供了这个特性. // 摘要: // 表示一个特性,该特性用于限制调用 ...
随机推荐
- Emgu学习之(三)——操作图像数据
Visual Studio Community 2015 工程和代码:http://pan.baidu.com/s/1jHmlQeE 内容 在这篇文章中将提到以下内容: 修改像素值 图像ROI 图像加 ...
- windows下使用Git
如何在windows下使用Git? 通过这里下载Git bash,你就可以像在Linux命令行一样操作git工具. 进入Git bash环境,默认是在当前用户路径下. 在Linux下,我们有根目录,在 ...
- jmeter接口测试3-正则表达式提取器的使用
正则表达式的用处很多,最基础的用法 1,断言 2,传参(关联) 例子 1.http请求 2正则表达式提取,想要提取列表列中id,一遍打开列表页 如果是1,每次就会取相同的值!匹配数字的权限高于模板$0 ...
- Dubbo实践(十三)Export
Spring在启动Dubbo服务端应用时,会实例化ServiceBean<T>并设置配置属性,然后调用export方法: @SuppressWarnings({"unchecke ...
- 模块XXXX可能与您正在运行的Windows版本不兼容。检查该模块是否与regsvr32.exe的x86(32位)x64(64位)版本兼容。
最近自己在编写ActiveX控件.遇到的麻烦事不少. 今天遇到了这个问题“模块XXXX可能与您正在运行的Windows版本不兼容.检查该模块是否与regsvr32.exe的x86(32位)x64(64 ...
- Ubuntu 编译出现 ISO C++ 2011 不支持的解决办法
问题 在编译时出现如下error: error:This file requires compiler and library support for the ISO C++ 2011 standar ...
- nginx编译问题:make[1]: *** [/usr/local/pcre//Makefile] Error 127
解决方法: 是由于nginx高版本的需要使用pcre原文件路径. 解压pcre-7.9.tar.gz 例如解压后位置在 /home/wang/pcre-7.9位置 使用nginx配置的时候 ./con ...
- ios开发者较为好用的工具
移动应用世界发生了巨大的变化,无论是在风格上还是在市场竞争上,消费者意识都推动了移动应用开发公司的崛起. 新的应用以及新的功能的出现 Apple IOS是为用户提供最新工具和升级的平台之一,它为iPh ...
- activeMQ的高级特性:嵌入activemq
activemq的高级特性之嵌入式activemq 1:编写activeMQ服务 import org.apache.activemq.broker.BrokerService; import org ...
- Linux下onvif客户端获取ipc摄像头 GetProfiles:获取h265媒体信息文件
GetProfiles:获取媒体信息文件 鉴权:但是在使用这个接口之前是需要鉴权的.ONVIF协议规定,部分接口需要鉴权,部分接口不需要鉴权,在调用需要鉴权的接口时不使用鉴权,会导致接口调用失败.实现 ...