解决同一IP不同端口或跨域访问站点iframe应用session丢失的问与及ASP.NET 开发相关超时设置

  • Post author:
  • Post category:其他



解决办法一:

Iframe  Session 丢失 跨域:

http://support.microsoft.com/kb/323752


解决办法二

在网站群的建设中,各子站需要共享主站的footer等公共信息。同时主站的后台管理也集成了各子站的管理,采取的方式是使用iframe嵌入各站的页面。在本机开发环境中,没有出现任何的问题。但是一放到测试环境中,便遇到session丢失的问题。

环境:应用服务器采用tomcat6.0,各个站点单独使用一个应用服务器,部署在一台物理服务器上。外部访问采用同一个IP,但是不同的端口。

起初以为,IE它的安全策略默认是会把iframe中的页面站点认为是不可信任的,它会阻止该站点传过来的cookie(如果你在iframe中的URL跳转是用的localhost,则不会被阻挡),所以因为没法使用cookie了,session便失效了。解决的方法是在过滤器,或者被嵌入的页面内加入属性为P3P的header信息。java为:response.addHeader(“P3P”,”CP=CAO PSA OUR”);但是依然没有成功。网上的解决方案都是这么说,况且自己以前还弄过,都成功过,这次怎么弄都不好。

今天脑子安静下来,仔细的分析这里面的原因。如果是IE的安全限制,但是火狐、google浏览器没有这样的限制,为什么这两个浏览器也出现这样的情况。这肯定不仅仅和跨域引起的P3P的安全问题有关。于是在本机测试,通过iframe引入测试环境中的链接,设置了P3P,发现一切正常。这就更说明了,测试环境中的问题绝对不是P3P的问题了。而且使用了同一个IP,也应该没有跨域的说法。那原因到底是什么呢?

慢慢的,我将视线注意到了端口上。这些网站的访问方式都是:同一IP+不同端口,难道和端口有关系。上网搜,关于这方面的内容太少了,但是总算在零星的资源中,找到了里面的原因。IP相同的两个session对应的cookie是一样的,而不幸的是sessionID就保存在cookie中,这样先访问A,再访问B的时候,B的sessionid会覆盖A的sessionid。这个事情没办法解决,所以你不要搞两个端口,最好是搞两个IP。原来都是cookie惹的祸,它不会区分端口,造成这多个站点不断的后来的覆盖前面的,从而造成session的丢失。问题解决了,将相互有引用的应用架构在不同的虚拟主机中,或者映射不同的IP。


Session 相关超时设置

采用虚拟主机的ASP网站在发布信息时遇到问题,设置session timeout = 60, 可是在几分钟,甚至几秒钟后,session就失效了, 提示超时退出。设置为session timeout=600也会出现同样的问题。但是在星期六, 在什么也没有改变的情况下,同样程序,运行基本正常,只有偶尔超时退出。在本机测试同样没有问题,本机IIS设置900秒,当然这个站点只有我自己在访问, 不象已经发布的网站,有不同的人在同时访问。

有网友说,如果服务器上iis设置的时间过短。好像session.timeout放在哪里设置的时间都不管用。该网友在自己的服务器上试过!

左右框架结构,左边菜单,右边内容,没有任何清空session的语句。

所以基本可以确定2点, 1、服务器IIS时间设置基本没有问题, 2、程序没有问题。那么问题到底在什么地方?

其实很多ASP开发者都会遇到这样的情况:在会话期间(session)无故丢失session。丢失了SessionID,同样session级的变量也会丢失。

很多session丢失的原因是因为错误的程序或者是错误的虚拟目录结构。SessionID 的改变有下面几个原因。

session丢失原因一

虚拟主机在线人数超过限制,导致前面的访问者被强制退出。 访问静态页面表现为无法连接, 访问ASP等动态页面, 表现为会话期间(session) 丢失,导致超时退出。解决办法只有扩大在线人数。

session丢失原因二

网站或空间被病毒或木马攻入, 修改或改变session, (session)丢失,导致超时退出。

session丢失原因三

Netscape的浏览器会认为”/App/user.asp”跟”/app/user.asp”是两个不同的程序。它会自动地开始一个新的会话期(new session)。所以,在你的网站上一定要统一字母的大小写。

session丢失原因四

另外一个是原因是 Session.Timeout 的值。

Timeout这个属性是用来设置Session的超时时间的,一分钟为单位。假如一个用户,在一个Timeout的时间内没有刷新或者请求页面,那么会话就会结束(the se ssion ends)。当你再次请求页面的时候,一个新的会话有会开始。

格式: Session.Timeout [ = nMinutes]

session丢失原因五

假如用户把浏览器的关了,当然session就不能保持。因为session的保持是要靠的。

要保持Session的状态,浏览器就必须支持,而且在打开的状态。当然也可以用其他的方法

session丢失原因六

常犯的错误就是,建立了错误的目录结构。像下面的目录结构:

root 放了global.asa

\virtual_root 没有global.asa

\another_virtual_root 没有global.asa

调用两个virtual roots的页面,就会执行相同的global.asa(root上的那个)

另外的一个目录结构:

root 没有global.asa

\virtual 放了global.asa

\another_virtual_root 另外一个global.asa

每一个不同目录下的global.asa都会各自执行,当然执行的代码就不同了。不过如果里面的代码一样,就令当别说。:)

所以你在请求不同目录下页面,将会导致不同的global.asa被执行。不同的变量被调用,不同的session id被建立….之前的有用的信息都被破坏了。

session丢失原因七

有些杀病毒软件会去扫描您的Web.Config文件,那时Session肯定掉,这是微软的说法。

session丢失原因八

服务器内存不足产生session丢失。

session.timeout 设置

session.timeout可以在网页的最开头设置,或者在创建session变量页面的最开头设置。

<%

session.timeout=20

%>

影响服务器产生超时的因素

1. Server.Timeout,

2. Connection对象的CommandTimeOut属性,

3. Command对象的CommandTimeOut属性,

4. IE浏览器的设置.

Server.Timeout,默认值是90秒。要增大它,在asp文件中加一句,如下:

Server.Timeout=900,将页面超时设为900秒。

只设置Server.Timeout,无论它的值设成多大,仍会出现timeout错误。

Connection对象和Command对象有个CommandTimeOut属性,默认是30秒,如果有一个耗时的查询或数据处理,很容易就超时了。要增大它,创建对象后,设置它的属性,如下:

con.CommandTimeOut = 900,

设为900秒,其中con是一Connection对象。如设为零,将无限等待,没有这一timeout限制。

Command对象不会继承Connection的这一属性,所以对可能超时的Command也要单独设置CommandTimeout属性。

最后IE也有个超时设置,5分钟从服务器得不到数据,也超时。

解决方法:(原文请参照微软KB中的Q181050)

1. IE要4.01 sp1以上版本.

2. 在注册表中HKEY_CURRENT_USERSoftwareMicrosoft WindowsCurrentVersionInternet Settings 中加一DWORD类型ReceiveTimeout,值设为比如8个9。

3. restart computer.

解决asp脚本运行超时的处理方法

脚本超时和这里的SESSION超时不是同一个问题, 不过顺便一起列出。

IIS默认的脚本超时时间是90秒。上传软件或者传送数据大于90秒的时候就会产生进程脚本超时放弃执行,保护服务器的处理大容量数据内存以及CPU占用,过大导致死机或者不稳定的情况。处理办法是:

1、在IIS所在网站的属性里点击 – 主目录 – 然后配置 – 选项 – 里ASP/CGI脚本超时,大小设置高一些。

2、直接在程序的头部加入

Server.TimeOut = 500

\’500是设置的脚本超时的时间,秒为单位,具体大小自己调整。