郁闷!
就在今天-项目验收的日子,居然遇到了session丢失问题,更郁闷的是我居然不知道还有session丢失问题。
这样的直接结果就是验收推迟,郁闷阿!
现在记录一下:
首先是主页面show了一个模态窗口,用来展示一个编辑页面,编辑页面提交的时候window.open("","target");然后就把submit的target指向这个页面,这样做是为了,提交后保留编辑页面的信息,不用重新在取一遍。哪知问题就这么发生了。原来window.open是会有session丢失的,以后再也不open一个新的页面了,早知道这样就用ajax了。
session变量“丢失”的问题
谈到了那么多的概念,终于可以说道实质性的问题了,session对象是web应用程序中最重要的对像之一,正是它的存在,使得我们可以在跨网页间传送数据,分辨不同用户成为可能。我们只要将变量制定给session即可实现。这一过程即session("temp")=temp即可。但最近不少网友都有这样的疑问,就是当我们在一个网页间设定了一个session变量后,到另一个网页,却消失了。这是什么样的原因呢。
根据上面的概念,我们可以将其原因,和处理办法总结如下。
1:asp网页跨了多个web应用程序:
这个原因就是你的另一个网页可能是另一个web应用程序。以前,一些资料过分的强调了会话变量的单一性,好像一个用户连接到一个web主机之后,只可能创建一个会话变量,这是不对的,分辨会话变量的依据正是我们上面所提到的web应用程序范围,而不是单独根据用户而建立的,你可以试一试下面的一段代码。
test.asp
<% @ language=vbscript %>
<%
session("temp")="temp"
Response.Write session.SessionID'sessionID用来分辨一个应用程序间的单独客户。
%>
将test.asp分别拷贝到两个不同的虚拟目录下。你就可以看到,他是两个不同的值了。所以,可能你的网页跨了不同的应用程序。
当然,这种情况对于初学者可能碰到,对于有经验的人可能犯的是这样的错误,即他们本身为一个根目录,但在制定虚拟目录时将其子目录又设为一个虚拟目录了,就如同我们上面提到的第二个表结构一样。这样他同样成为了两个不同的web应用程序。也就不难解释为什么会出错了。
2:可能是启动了多个同一应用程序。
第一种情况很好发现,也容易改正,但这第二种情况就不容易发现,也较难改正。这里我们引入一个另一个的概念。多个同一应用程序共存,(好长呀,关键是微软的概念我忘了,这个是我自己起的。呵呵!),它的意思从这个定义上很好理解,就是对于同一个应用程序。同一时间可以在内存中存在多个。如我们常见的acdsee.exe,你可以通过点击启动多个acdsee.exe。而另外一种则不能,我们就不说它的定义了(如果说的话,就是相同应用程序不共存,呵呵!)在同一时间内,如果已经启动了一个应用程序,则不能再启动相同的应用的应用程序了。如foxmail.exe,当你启动了一个foxmail.exe后,就只可能在内存中存在一个foxmail.如果你在启动,则不会再开一个foxmail窗口了。
而我们的ie属于前者,你可以通过点击ie,启动多个ie应用程序。此时,我们做下面另一个测试。你将上面的代码test.asp放入一个虚拟目录中。然后,你点击ie启动(注意:是通过点击Ie启动,不是按CTRL+N,也不是在一个ie窗口点击文件,重新打开一个窗口)此时,你可以发现,他们虽然是同一个地址,同一个用户,但sessionID还是不同的,当然,你还可以建另一个文件。如
test2.asp
<% @ language=vbscript %>
<%
response.write session("temp")
%>
这时,你在另一个ie窗口下,你就会发现session("temp")为空,也就是说,我们刚才明明在test.asp中附了值,而且test2.asp和test.asp在同一虚拟目录下,但session("temp")却丢失了。原来,相对于相同的asp应用程序。不同的ie相对的却是不同的asp应用程序。(有点像绕口令难懂是吧。)不过,我们已经明白了它的起因,相信不难解决他。
这里还要注意的是,我们刚才一再提到的是通过点击Ie,而不是通过按CTRL+N,也不是在一个ie窗口点击文件,重新打开一个窗口,这里要说明的是如果你通过在一个ie窗口打开的窗口,它属于派生窗口,而不是共生窗口,就是说,此时的另一个窗口属于和其上一个窗口是继承关系,属于同一个应用程序范围。
3:连接不当
其实,大部分的网友碰到的问题是通过点击页面中的连接新开窗口而发现session变量丢失的。他同按ctrl+N新开窗口的意义相同。但此时为什么会出问题呢?我们来分析一下它的连接方式。可能为<a href="xx.asp" traget=_blank>click me </a>通过这样点击的连接同ctrl+n 是相同的,应该不会出问题。还有一种连接式通过脚本控制的如window.open "xx.asp","name","toolbar=no"这样的代码,他就可能发生这样的问题。如果通过点击ie开了多个共生窗口(许多网友为了节省时间,他们喜欢开多个窗口。比如我。)。就是他可能在新开的窗口中如果含有相同的name的窗口。则此时,就可能发生连接不当导致session丢失,其实,原因还是通第二种一样。还有一种更极端的方式开新窗口,通过用document.write 在一个脚本中动态写出新的页面,而该页面的url是不存在的,这样就更可能出问题了,应为session正是通过url,http来追踪的。所以如果其页面地址是动态的话。则session就根本无法追踪了。
相信通过以上例子的分析,可能会解释你在应用session中出现的大部分问题。但不是全部(如过你禁用cookie的话,呵呵!)但是,如果你将以上的概念都弄懂,则可以解决你在应用session中出现的所用问题了。
分享到:
相关推荐
然而,Session丢失问题可能会导致用户在未主动退出的情况下被迫重新登录,这对用户体验来说是极为不便的。以下将详细探讨Session丢失的可能原因及解决策略。 1. **Session超时**:服务器默认设置了一个Session的...
Asp.net解决session丢失问题的两种方案,以及session丢失的原因。参考一些网上资料,自己总结出来解决方案,顺便附带两个测试案例。还有不清楚的请联系我QQ:394023002 附加信息:周
设置`mode`属性为`StateServer`,并指定`stateConnectionString`,这使得Session数据不在本地存储,而是通过TCP/IP连接到一个独立的State Server服务,从而避免了由于IFrame环境导致的Session丢失问题。 2. **调整...
ASP.NET Session 丢失通常是由多种原因引起的,包括进程重启、Session超时、配置文件更改、应用程序更新或杀毒...通过选择合适的Session存储模式、优化配置以及正确处理对象序列化,可以有效地避免Session丢失问题。
在ASP.NET开发中,Session是用于存储用户会话数据的关键机制。它允许开发者在用户浏览网站的不同页面之间保持...可以参考提供的"ASP.NET Session丢失问题原因及解决方案.pdf"文档,获取更详细的技术指南和案例分析。
综上所述,Session丢失问题主要由多种因素共同作用引起。通过上述方案的实施,可以有效降低Session丢失的风险,提高系统的稳定性和用户体验。在实际应用中还需根据具体情况进行灵活调整和优化。
下面是处理和解决Nginx session丢失问题的一些知识点和方法: 1. 了解Session机制:在Web应用中,Session用于在服务器端保存用户的会话状态。用户登录后,服务器会生成一个唯一的Session ID,通常存储在用户的...
以下详细介绍Yii框架中用户登录后session丢失问题的解决方法。 首先,我们需要了解Yii框架中用户登录和session管理的基本原理。在Yii中,用户登录通常是通过认证组件(CWebUser)来完成的。当用户正确输入用户名和...
### 分布式环境中Session丢失问题解析与解决方案 #### 一、引言 在现代互联网应用中,随着业务规模的增长和技术架构的演进,单体应用逐渐演化为微服务架构,而这种架构变化带来的一个常见问题是分布式环境下的...
重定向的时候是有session丢失的问题;window.open丢失session问题;使用框架(Frameset)调用不同域名下的页面,会出现此域下页面的Cookies和Session丢失的现象。
本文将详细介绍几种常见的C# Session丢失问题及其解决办法。 首先,Session状态丢失的原因可能有以下几种: 1. 杀毒软件扫描Web.Config文件。由于Web.Config文件包含了应用程序配置信息,包括Session状态的设置,...
标题中的问题涉及到的是PHP在Internet Explorer (IE) 浏览器下,特别是在使用iframe时,出现的Session丢失问题。在描述中提到,当一个登录页面被其他网站通过iframe框架加载时,用户在IE浏览器中无法正常登录,因为...
总之,要解决ASP.NET在IE10中的登录判断失败和Session丢失问题,可以采取两种策略:一是安装微软提供的Hotfix更新程序,二是手动编辑并添加浏览器定义文件。两种方法都可以有效地修复框架对IE10的兼容性问题,确保...
解决Session丢失问题的方法: 1. 调整Session超时时间,延长Session的生命周期。 2. 使用持久化的Session状态存储,如StateServer或SQLServer模式。 3. 当进行文件操作时,确保操作是异步的,避免阻塞主线程导致...
现在Ajax在Web项目中应用广泛,几乎可以说无处不在,这就带来另外一个问题:当Ajax请求遇到Session超时,应该怎么办? 显而易见,传统的页面跳转在此已经不适用,因为Ajax请求是XMLHTTPRequest对象发起的而不