相信很多人遇到过同一个浏览器会出现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的更多相关文章

  1. 【项目实践】一文带你搞定Session和JWT的登录认证方式

    以项目驱动学习,以实践检验真知 前言 登录认证,估计是所有系统中最常见的功能了,并且也是最基础.最重要的功能.为了做好这一块而诞生了许多安全框架,比如最常见的Shiro.Spring Security ...

  2. 【C语言】超详讲解☀️指针是个什么针?(一次性搞定指针问题)

    目录 前言 一. 什么是指针? 引例 计算机是怎么对内存单元编号的呢? 内存空间的地址如何得到 想存地址怎么办? ​ 本质目的不是为了存地址 二.指针和指针类型 为什么有不同类型的指针 1.指针的解引 ...

  3. Spring Boot 一个依赖搞定 session 共享,没有比这更简单的方案了!

    有的人可能会觉得题目有点夸张,其实不夸张,题目没有使用任何修辞手法!认真读完本文,你就知道松哥说的是对的了! 在传统的单服务架构中,一般来说,只有一个服务器,那么不存在 Session 共享问题,但是 ...

  4. SpringBoot一个依赖搞定session共享

    原文:微信公众号:Java开发宝典  https://mp.weixin.qq.com/s/_VFY9lXqNhH8Nh4HC9tuMg 1. 前言 在传统的单服务架构中,一般来说,只有一个服务器,那 ...

  5. 深入探讨C#中Socket一次性搞定消息发送

    转载自:http://tech.chinaunix.net/a2010/0909/1101/000001101396.shtml     [IT168 技术文档]最近浏览了几篇有关Socket发送消息 ...

  6. 轻松几句搞定【Javascript中的this指向】问题

    this关键字在JavaScript中扮演了至关重要的角色,每次它的出现都伴随着它的指向问题,这也是很多初学者容易出错的地方. 不过,这篇文章将会带你一次性搞定this指向的问题,望能给大家提供帮助! ...

  7. DEV设计之自动流水号,DEV专家解答,自己折腾了半天也没有搞定,怪英文不好

    () 老外专家给了回答,结果没有全到懂,又折腾了20分钟朋友提示才搞定 获取一个自动增加1的流水号值, 第一个参数是本事的数据库连接对象,第2个参数是也这个值为唯一标识返回来一个增量的值,第三个好像没 ...

  8. 如何使用 APM 搞定 PHP 应用的性能优化?

    APM 究竟是什么? 很多人都是第一次听说 APM 的概念,本文主要阐述如何使用 APM 的解决方案来实现 PHP 应用性能的优化.首先先介绍一下 APM (Application Performan ...

  9. 转:C4项目中验证用户登录一个特性就搞定

    转:C4项目中验证用户登录一个特性就搞定   在开发过程中,需要用户登陆才能访问指定的页面这种功能,微软已经提供了这个特性.     // 摘要:    //     表示一个特性,该特性用于限制调用 ...

随机推荐

  1. 33、springboot整合springcloud

    Spring Cloud Spring Cloud是一个分布式的整体解决方案.Spring Cloud 为开发者提供了在分布式系统 (配置管理,服务发现,熔断,路由,微代理,控制总线,一次性token ...

  2. IntelliJ IDEA编写的spark程序在远程spark集群上运行

    准备工作 需要有三台主机,其中一台主机充当master,另外两台主机分别为slave01,slave02,并且要求三台主机处于同一个局域网下 通过命令:ifconfig 可以查看主机的IP地址,如下图 ...

  3. J2EE从下载到配置成功

    1,首先在www.oracle.com网站下载JDK 2 3 4,可以根据自己的需要下载相应的JDK 5,在安装的过程中要将JDK的安装路径和JRE的安装路径安装在不同文件夹中以示区别,例如 6,配置 ...

  4. 关于ie8下监听input事件的不兼容问题。

    关于在ie8下,监听输入框的值变化的input事件不支持的解决办法: 很懒...直接上原文地址.... 原文地址:http://www.cnblogs.com/lhb25/archive/2012/1 ...

  5. ORACLE NLS_LENGTH_SEMANTICS 参数的用途

    NLS_LENGTH_SEMANTICS参数是一个专为创建CHAR和VARCHAR2两种字符型的列时,指定使用的字节长度,还是使用字符长度的定义方式,有byte和char两种值,默认为byte. 当设 ...

  6. Oracle 实例管理

    理解初始化参数文件实例由内存中构建它的参数来定义.许多参数(但不是全部)可以在启动后更改.有些参数在启动时就固定了,只能在关闭实例并再次启动时更改. 静态和动态参数文件参数文件由两类:静态参数文件(也 ...

  7. ODI使用流程

    ---恢复内容开始--- ODI流程 Topology 1.建立 源 物理结构体系 2.建立 目的 物理结构体系 步骤同上 3.建立 源 逻辑架构 4.建立 目的 逻辑架构 步骤同上 Designer ...

  8. iOS 数据安全、数据加密传输

    近期接到一个新需求:APP企业版需要接入热更新功能. 热更新需要下发补丁脚本, 脚本下发过程中需要保证脚本传输安全,且需要避免中间人攻击. 需要用到数据加密传输方面的知识,以下是我设计的加密解密流程: ...

  9. 使用属性Props完成一张卡片

    一:我们先安装bootstrap,为了使我们的样式好看些 cnpm  install bootstrap  --save 二:我们在index.js中引入bootstap Import ‘bootst ...

  10. iOS audio不支持循环播放

    解决办法:监听播放完成事件(注意点,audio标签不能设置循环播放,去除标签 loop="loop"或者 loop="false",不然不走播放完成事件) $( ...