13

我有一个经典的 asp 页面的问题,我只是无法解决它,因为 3 天。

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

我编写了一个测试页面,它输出当前的 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. 页面加载后立即刷新页面多次

如果您重复此步骤,那么会随机(并非总是)使用两个不同的 ASPSESSIONID 填充 HTTP_COOKIE。

asp 测试文件仅输出提及的值,源代码中没有发生任何其他事情。

这是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 中出现多个 ASPSESSIONId?

谢谢你的帮助!

4

7 回答 7

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>
于 2013-10-31T15:00:50.720 回答
5

您可以使用 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>
于 2018-12-25T15:14:46.850 回答
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();
于 2013-01-12T19:30:46.903 回答
1

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

于 2016-02-05T11:24:13.047 回答
0

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

在应用程序池中的回收选项中,检查您是否没有过早回收您的应用程序,否则您将在每个重新生成的新应用程序中以 ASPSESSIONIDXXXXXXX 结束。

有几种回收条件。我错误地将“最小请求数”设置为 1,并为每个请求获取了一个 ASPSESSIONID

于 2017-11-15T00:06:13.510 回答
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
于 2015-12-01T12:25:58.073 回答
-1

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

<% 
Session("test") = "test value" 
a=Session("test")
response.Write(a)
%>
于 2012-10-09T08:51:07.193 回答