【发布时间】:2010-11-24 03:40:53
【问题描述】:
我正在维护一个经典的 ASP 网站,最近我们想要在访问者来自一组特定网站时进行特殊的渲染操作。因此,在这些访问者必须通过才能访问我们网站的页面中,我放置了一个简单的行来设置会话变量:
<!-- #include virtual="/clsdbAccess.cs"-->
<%
set db = new dbAccess
%>
<html>
<head>
...
<script language="javascript" type="text/javascript">
...
</script>
</head>
<body>
<%
Session("CAME_FROM_NEWSPAPER") = "your local newspaper"
...
%>
... html stuff ...
</body>
</html>
然后,在接下来的所有页面中,每当我需要放置我们不想向这些访问者显示的导航链接、菜单等时,我都会测试该会话变量是否为“”,然后进行相应的渲染。
我的问题是,它似乎在开发中对我很有效,然后我将它投入生产,有时效果很好,有时根本不起作用。有时会设置会话变量,有时则不会。其他一切都很好。但是我们的客户在呈现给访问者的页面上看到不一致的结果,这是一个问题。我尝试从不同的 PC 登录,并确认我得到了不同的、不可预测的结果。问题是我无法随意复制它,也无法对生产进行故障排除/跟踪。
现在我已经解决了这个问题,方法是创建具有特殊渲染的重复页面,并确保那些访问者去那里。但这是一种 hack,最终将难以维护。
Classic ASP 中的会话变量有什么特别或不一致的地方吗?有没有更好的方法来解决这个问题? TIA。
更新 我发现您第一次通过该页面访问该站点时,会话变量未设置。菜单和所有内容(在这些情况下不应该出现)第一次出现。然后,如果您返回并刷新登录页面,请再次浏览到同一页面,这一次它可以工作,然后。然后我删除了我所有的缓存、cookie 等,再次点击登录页面,再次进入我的页面:Bam,菜单(即没有会话变量)。我创建了一个页面“sessionvars.asp”,在其中显示了该变量的内容,果然,它是空白的。至少现在我可以随意重现这个问题,我应该能够在 Dev 上复制它并追踪它。
【问题讨论】:
-
一种可能性是,由于会话变量作为 cookie 存储在客户端浏览器中,因此根据客户端 cookie 首选项,您的变量不会被存储
-
他们是??我以为它们会存储在服务器上。这就是我决定使用会话变量而不是显式使用 cookie 的原因。哎呀。我讨厌这种经典的东西。
-
@Mike:你弄错了那根棍子。 Rob 所说的只是 标识 会话的密钥作为 cookie 发送给客户端。会话的实际数据存储在服务器端。
-
会话变量存储在服务器上,而会话 id 存储在客户端。这样服务器就可以为请求唯一地获取正确的会话对象。如果您在查看您的网站时检查您的 cookie,您会看到一个名为 ASPSESSIONIDxxxxxxx 的 cookie,其中“x”是随机序列。许多平台(asp、asp.net、php 等)都以这种方式处理会话。
-
肯定存在范围界定问题。我将会话变量的值添加到主登录窗口中的注释中,该注释在客户站点的 iframe 中呈现。那里的值是正确的。然后,当它在新窗口中到达我的网站时,价值就消失了。我想我必须使用查询字符串将它传递到我的域中。
标签: asp-classic