一次性搞定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项目中验证用户登录一个特性就搞定 在开发过程中,需要用户登陆才能访问指定的页面这种功能,微软已经提供了这个特性. // 摘要: // 表示一个特性,该特性用于限制调用 ...
随机推荐
- C、CSL 的密码 【set暴力 || 后缀数组】 (“新智认知”杯上海高校程序设计竞赛暨第十七届上海大学程序设计春季联赛 )
题目传送门:https://ac.nowcoder.com/acm/contest/551/C 题目描述 众所周知,CSL 最喜欢的密码是 ******.于是有一天…… 为了改变这一点,他决定 ...
- concatenate
concatenate函数的作用是对numpy数组或tensor进行拼接 >>> a = np.array([[1, 2], [3, 4]]) >>> b = np ...
- SSM框架优缺点和spring boot 比起优缺点是什么?
一.SSM优缺点应该分开来说的,比如 1)spring 不说了,核心ioc.aop技术,ioc解耦,使得代码复用,可维护性大幅度提升,aop提供切面编程,同样的增强了生产力. 2)spring mvc ...
- Dubbo实践(六)Spring加载Bean流程
根据上一小节对于spring扩展schema的介绍,大概可以猜到dubbo中相关的内容是如何实现的. 再来回顾Dubbo实践(一)中定义的dubbo-provider.xml: <?xml ve ...
- Loj_6282. 数列分块入门 6
Loj_6282 这个题目涉及到了块的重构,这里使用了\(\sqrt{n}\)次插入便重构的方法 讲重复的操作提出来做了函数 #include <iostream> #include &l ...
- Reading Software Defined Traffic Measurement with OpenSketch
NSDI '13 概要 OpenSketch是一个通用的.抽象的测量框架, 与SDN 网络架构类似, OpenSketch 提出将测量控制层和数据层解耦. 数据层运行设为可动态配置的3阶段流水线, 首 ...
- java 进销存 crm 客户管理 库存管理 商户管理 springmvc SSM 项目
系统介绍: 1.系统采用主流的 SSM 框架 jsp JSTL bootstrap html5 (PC浏览器使用) 2.springmvc +spring4.3.7+ mybaits3.3 SSM ...
- .net core 实践笔记(二)--EF连接Azure Sql
** 温馨提示:如需转载本文,请注明内容出处.** 本文链接:https://www.cnblogs.com/grom/p/9902098.html 笔者使用了常见的三层架构,Api展示层注入了Swa ...
- Linux 不杀进程的情况下,如何释放磁盘资源
最近项目组人员反馈一个问题:即磁盘空间满了,但是并没看到有什么文件占用空间: [root@xxxx home]# df -h Filesystem Size Used Avail Use% Mount ...
- C++_构造函数与析构函数
构造函数与析构函数 OOP第二课 1 构造函数 1.1 构造函数具有一些特殊的性质 1.2 定义构造函数的一般形式 1.3 利用构造函数创建对象 2 成员初始化表 3 缺省参数的构造函数 4 重载构造 ...