我有一个传统的ASP页面的一个问题,我只是不解决它,因为3天。
该页面正在与会话 - 有时它发生的ASPSESSIONID饼干在Request.ServerVariables设置两次(“HTTP_COOKIE”)。 这使得ASP页两个会话之间跳转的页面被刷新时。
我已经写它输出当前的SessionID,服务器软件和HTTP_COOKIE值的测试页。
示例输出:
会话ID:308542840
会话超时:20分钟
服务器软件:Microsoft-IIS / 6.0
HTTP_COOKIE:ASPSESSIONIDQCBATRAD = MBHHDGCBGGBJBMAEGLDAJLGF; ASPSESSIONIDQCCDTTCB = PGHPDGCBPLKALGGKIPOFIGDM
为什么有两个ASPSESSIONIDs? 当我刷新页面,然后它随机输出两个Session ID之一。
这里有一个截屏,其显示了IE9的问题: http://prinz-alexander.at/asp_test.avi
这个错误通常发生在IE8和IE9。
只要做到以下重现问题:
- 完全关闭IE8或IE9
- 启动IE8或IE9和开放http://www.pfiffikus.at/pfiffikus/tests/
- 后立刻将页面加载刷新页面多发时间
如果重复此步骤,然后随机(不总是)在HTTP_COOKIE安装了两个不同的ASPSESSIONIDs。
ASP的测试文件只outputing的mentiod值,没有别的是发生在源代码中。
这是ASP测试文件的代码:
<% If trim(Session("test_val")) = "" Then
Dim my_num
Randomize
number = Int((rnd*1000))+1
Session("test_val") = number
End If
%>
<b>Session ID:</b>
<% response.write(Session.SessionId) %><br /><br />
<b>Session("test_val"):</b>
<% response.write(Session("test_val")) %><br /><br />
<b>Session Timeout:</b>
<% response.write(Session.Timeout) %> minutes<br /><br />
<b>Server Software:</b>
<% response.write(Request.ServerVariables("SERVER_SOFTWARE")) %><br /> <br />
<b>HTTP_COOKIE:</b> <% response.write(Request.ServerVariables("HTTP_COOKIE")) %>
我怎样才能避免饼干多个ASPSESSIONIds?
谢谢你的帮助!
我能够删除这些cookie使用JavaScript。
毗邻脚本添加到登录页面的末端。 这将删除所有“ASPSESSIONIDXXXXXXX”饼干之前用户登录网站:
<script type="text/javascript">
//Clear any session cookies
(function(){
var cookiesArr = document.cookie.split("; ");
for (var i = 0; i < cookiesArr.length; i++) {
var cItem = cookiesArr[i].split("=");
if (cItem.length > 0 && cItem[0].indexOf("ASPSESSIONID") == 0) {
deleteCookie(cItem[0]);
}
}
function deleteCookie(name) {
var expDate = new Date();
expDate.setTime(expDate.getTime() - 86400000); //-1 day
var value = "; expires=" + expDate.toGMTString() + ";path=/";
document.cookie = name + "=" + value;
}
})();
</script>
这个问题也困扰了我很长一段时间。 我解决不了。
这是没有的浏览器业务。 我的Chrome,火狐,IE浏览器都有这个问题。
有时候,我可以看到一个页面20+ ASPSESSIONIDXXXX饼干。
最后,我必须使用JavaScript来清除旧ASPSESSIONID ***,并保持最新的一个。
function clearASPSESSIONID(){
var cks = document.cookie.match(/\b(ASPSESSIONID[A-Z]+)(?==)/g),
lskey = 'oldASPSESSIONID-'+location.protocol+'//'+location.host,
old = window.localStorage ? localStorage.getItem(lskey) : '',
keep, i;
for(i=0;i<cks.length;i++){
if((old && old.indexOf(cks[i])<0) || i==cks.length-1){
keep = cks[i];
}
}
for(i=0;i<cks.length;i++){
if(keep != cks[i]){
document.cookie = cks[i] + '=; expires=Thu, 01 Jan 1970 00:00:01 GMT;';
}
}
if(window.localStorage){
localStorage.setItem(lskey, keep ? keep : '');
}
}
clearASPSESSIONID();
转到应用程序池“高级设置”,并设置‘最大工作进程’为1。
您可以使用URL重写国防部重新命名的会话cookie时,它被设置和使用入站重写规则再次恢复它。 当会话名ID的变化,但通过给会话cookie一组名称和包括ID cookie自身内会有永远只能是一次在一个会话cookie的多个会话Cookie发生。
使用这些重写规则在web.config中改变
ASPSESSIONIDXXXXXXXX=YYYYYYYYYYYYYYYYYYYYYYYY
成
session=XXXXXXXX/YYYYYYYYYYYYYYYYYYYYYYYY
然后再次恢复其对入站请求(所以它仍然可以通过IIS来读取):
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<clear />
<!-- "HTTP_COOKIE" must be added to the "allowed server variables" in IIS under URLRewrite -->
<rule name="session cookie revert">
<match url="(.*)" />
<conditions>
<add input="{HTTP_COOKIE}" pattern="(.*)session=([0-9a-zA-Z]+)\/([0-9a-zA-Z]+)(.*)" />
</conditions>
<serverVariables>
<set name="HTTP_COOKIE" value="{C:1}ASPSESSIONID{C:2}={C:3}{C:4}" />
</serverVariables>
<action type="None" />
</rule>
</rules>
<outboundRules>
<rule name="session cookie rewrite">
<match serverVariable="RESPONSE_Set_Cookie" pattern="ASPSESSIONID([0-9a-zA-Z]+)=([0-9a-zA-Z]+)(.*)" negate="false" />
<!-- Set the session cookie as HttpOnly during the rewrite. Classic ASP doesn't
do this by default, but it's important for preventing XSS cookie stealing.
You could also add "; Secure" if you only want the session cookie to be passed
over an SSL connection, although this also means the cookie can only be set over
an SSL connection too, which could be a problem when testing on localhost. -->
<action type="Rewrite" value="session={R:1}/{R:2}{R:3}; HttpOnly" />
</rule>
</outboundRules>
</rewrite>
</system.webServer>
</configuration>
在global.asa文件:
Sub Session_OnStart
Dim cookie, cookies : cookies = Split(Request.ServerVariables("HTTP_COOKIE"),";")
For Each cookie In cookies
cookie = Trim(Split(cookie,"=")(0))
If Left(cookie,12) = "ASPSESSIONID" Then
Response.AddHeader "Set-Cookie", cookie&"=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/"
End If
Next
End Sub
也许以后,但因为没有公认的答案可能是有用的。
在应用程序池,在回收选项,请检查您是否不要太快回收您的应用程序或将与ASPSESSIONIDXXXXXXX结束了,你复活的时候每个新的应用程序。
有几个回收条件。 我错误地设置了1“的请求的最低数量”,并得到了一个ASPSESSIONID为每个请求
你已经在你的用户的会话分配一个值。 尝试获取您的抓取你这样的会议,并分配不同的唯一值对每个用户
<%
Session("test") = "test value"
a=Session("test")
response.Write(a)
%>