经典ASP:Cookie中的多个ASPSESSIONID

时间:2012-10-08 14:33:07

标签: session iis cookies asp-classic iis-6

我的经典asp页面有问题,我从3天开始就无法解决。

页面正在使用Sessions - 有时会发生ASPSESSIONID cookie在Request.ServerVariables(“HTTP_COOKIE”)中设置两次。这会导致ASP页面在刷新页面时在两个Sessions之间跳转。

我编写了一个测试页面,输出当前的SessionId,服务器软件和HTTP_COOKIE值。

示例输出:


会话ID:308542840

会话超时:20分钟

服务器软件:Microsoft-IIS / 6.0

HTTP_COOKIE:ASPSESSIONIDQCBATRAD = MBHHDGCBGGBJBMAEGLDAJLGF; ASPSESSIONIDQCCDTTCB = PGHPDGCBPLKALGGKIPOFIGDM


为什么有两个ASPSESSIONID? 当我刷新页面时,它会随机输出两个会话ID中的一个。

这是一个截屏,显示了IE9中的问题: http://prinz-alexander.at/asp_test.avi

此错误通常发生在ie8和ie9。

只需执行以下操作即可重新创建问题:

  1. 完全关闭IE8或IE9
  2. 启动IE8或IE9并打开http://www.pfiffikus.at/pfiffikus/tests/
  3. 在页面加载后立即刷新页面多次
  4. 如果您重复此步骤,则随机(并非总是)HTTP_COOKIE将填充两个不同的ASPSESSIONID。

    asp测试文件只输出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")) %>
    

    如何在Cookie中避免多个ASPSESSIONIds?

    感谢您的帮助!

7 个答案:

答案 0 :(得分:6)

我可以使用Javascript删除这些Cookie。

只需将下一个脚本添加到登录页面的末尾即可。 这将在用户登录网站之前删除所有“ASPSESSIONIDXXXXXXX”cookie:

<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>

答案 1 :(得分:1)

这个问题也困扰了我很长一段时间。我无法解决它。

这不是浏览器业务。我的Chrome,Firefox,IE都有这个问题。

有时我可以在一个页面中看到20多个ASPSESSIONIDXXXX cookie。

最后我必须使用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();

答案 2 :(得分:1)

转到应用程序池'高级设置'并将“最大工作进程数”设置为1.

答案 3 :(得分:1)

设置后,您可以使用URL Rewrite mod重命名会话cookie,并使用入站重写规则将其重新还原。会话名称ID更改时,会发生多个会话cookie,但是通过给会话cookie设置名称并将ID包含在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>

答案 4 :(得分:0)

在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

答案 5 :(得分:0)

也许以后可能会有用,因为没有接受的答案。

在应用程序池中,在回收选项中,检查是否存在 过早回收您的申请,或者您将结束 ASPSESSIONIDXXXXXXX用于您重新生成的每个新应用程序。

有几种回收条件。 我设置了#34;最少数量的请求&#34;错误地得到了1 每个请求的ASPSESSIONID

答案 6 :(得分:-1)

您已在用户的会话中分配了值。尝试像这样获取您的会话并为每个用户分配不同的唯一值

<% 
Session("test") = "test value" 
a=Session("test")
response.Write(a)
%>