JavaScript 清空Session

摘要:
然后,我们想到使用Cookie和3Session来记录用户打开考试或学习窗口,并判断学习页面1if(会话[“study”]==null||Session[“studie”]==“”)2{会话[“tudy”]=“true”;4}5 else6{7stringmyScript=@“alert('您已打开在线学习窗口。

      众所周知,Session是运行在服务器端的,JavaScript是运行在客户端的,JavaScript不能直接运行服务器端的代码。但最近笔者却遇到了这样的需求:在一个学习系统里面,用户不能同时打开两个在线考试或在线学习的窗口。通过打开模态对话框,的确可以禁止用户再打开一个新窗口,但如果用户重新打开一个新的页面,却可以打开一个新的对话框。

      于是便想到了使用Cookies和Session记录用户打开考试或学习窗口,因为Cookies和Session都有全局作用。但Cookies有个缺点就是,如果用户清空了Cookies,则Cookies值便会丢失,于是便剩下使用Session了。但有个比较棘手的问题是,如果用户直接按浏览器的关闭按钮退出窗口怎么办?因为这样根本就不会执行后台的代码。于是便很容易想到了使用Ajax请求的方式。如下面代码:

      在在线学习页面的cs文件中判断是否已经打开学习页面

1 if (Session["study"]==null || Session["study"]=="")
2 {
3 Session["study"] = "true";
4 }
5  else
6 {
7 string myScript = @"alert('你已经打开一个在线学习窗口,不能同时打开多个在线学习窗口!');
type = 1; window.close(); ";
8 Page.ClientScript.RegisterStartupScript(this.GetType(), "MyScript", myScript, true);
9 }

      注意,这里注册了一段JavaScript,并且调用了window.close()方法,这种情况下关闭页面是不能清空Session[“study”]的值的。所以加了一个type=1,如果是type==1,则不清空Session值。而前台也声明了一个type=0,当type==0表示是用户直接关闭窗口,是需要清空Session值。

     

1 function window.onbeforeunload() {
2 if (type == 0) {
3 var xmlHttp = createXMLHttpRequest();
4 xmlHttp.open('GET', "EndStudy.aspx", true);
5 xmlHttp.send(null);
6 xmlHttp.onreadystatechange = function() {
7 if (4 == xmlHttp.readyState) {
8 if (200 == xmlHttp.status) {
9 }
10 else {
11 }
12 }
13 }
14 }
15 }

       在EndStudy.aspx.cs中清除Session的值

1 protected void Page_Load(object sender, EventArgs e)
2 {
3 Session["study"] = "";
4 }

      貌似这种方法没有什么问题。如果在关闭窗口前,请求页面清除了Session的值,的确可以实现需求。但我却为此郁闷了很久,发现第一次关闭页面清除Sesson值成功,第二次关闭页面时,请求EndStudy.aspx成功,去没有执行EndStudy.aspx.cs中的Page_Load函数。所以想再次打开在线学习页面,却提示不能“同时打开两个在线学习窗口”。

      后来想到对话框是有缓存的,于是便在在线学习页面和它的承载页面的Page_Load执行了清除Session的代码:

1 Response.Buffer = true;
2 Response.ExpiresAbsolute = System.DateTime.Now.AddSeconds(-1);
3 Response.Expires = 0;
4 Response.CacheControl = "no-cache";
5 Response.AddHeader("Pragma", "No-Cache");

       但问题依旧,最后在EndStudy.aspx.cs的Page_Load也加了清除Session的代码才解决问题。

       EndStudy.aspx.cs中的Page_Load最终代码如下:

1 protected void Page_Load(object sender, EventArgs e)
2 {
3 Response.Buffer = true;
4 Response.ExpiresAbsolute = System.DateTime.Now.AddSeconds(-1);
5 Response.Expires = 0;
6 Response.CacheControl = "no-cache";
7 Response.AddHeader("Pragma", "No-Cache");
8
9 Session["study"] = "";
10 }

免责声明:文章转载自《JavaScript 清空Session》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ASP.NET输出JSON格式数据ASP.NET Core 实现 MQTT通讯协议 Demo(开源库:MQTTnet)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

MacOs终端忽略大小写

使用MacOs的终端时,唯一让人感觉不爽的就是Tab补全是区分大小的,所以查了资料就把这个问题搞定了。在用户目录下创建 .inputrc 文件,内容为以下三行代码,保存后重启终端再次输入文件名Tab补全就可以忽略大小写。 set completion-ignore-case on set show-all-if-ambiguous on TAB:menu-...

[渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:MVC程序中实体框架的Code First迁移和部署

这是微软官方SignalR 2.0教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第五篇:MVC程序中实体框架的Code First迁移和部署 原文:Code First Migrations and Deployment with the Entity F...

转:Android设置全局变量

声明:本文转自feiyangxiaomi的博客:http://blog.csdn.net/feiyangxiaomi/article/details/9966215仅供学习使用,转载请指明原作者。 文中介绍了两种在Android中使用全局变量的方法,其中第一中是android推荐的,但是只能用于继承Activity类使用,第二种是java中设置静态变量和方...

华为网络设备常用命令

华为交换机配置端口表示方法E1/0/1显示系统版本信息:display version显示诊断信息:display diagnostic-information显示系统当前配置:display current-configuration显示系统保存配置: display saved-configuration显示接口信息:display interface...

HTML 5 音频(audio)

 audio 元素支持三种音频格式 IE 9 Firefox 3.5 Opera 10.5 Chrome 3.0 Safari 3.0 Ogg Vorbis   √ √ √   MP3 √     √ √ Wav   √ √   √  1、设置一个ogg格式的文件 <audio src="http://t.zoukankan.co...

WPF实现无刷新动态切换多语言(国际化)

1. 在WPF中国际化使用的是 .xaml文件的格式       如图:Resource Dictionary (WPF)        2. 创建默认的语言文件和其他语言文件        这里以英语为默认语言,新建一个 Resource Dictionary (WPF)文件,并命名为DefaultLanguage.xaml,内容如下:    <R...