asp-classic - 经典 ASP/ session 结束重定向

标签 asp-classic vbscript

我想在用户 session 过期时自动重定向到登录页面。

我一直在位于应用程序每个页面顶部的包含文件中使用以下代码:

Session.Timeout = 60
Response.AddHeader "Refresh", CStr(CInt(Session.Timeout + 1) * 60)
Response.AddHeader "cache-control", "private"
Response.AddHeader "Pragma","No-Cache"
Response.Buffer = True
Response.Expires = 0
Response.ExpiresAbsolute = 0

If Session("accountID") = "" Then
    Response.Redirect("http://www.mydomain.com/")
End If

这有效,但有非常小的错误。即使 session 仍然存在,页面也会时不时地刷新,而且它似乎在 60 分钟结束之前就刷新了!

谁能看出问题出在哪里,或者您能建议一种不同的方法吗?

最佳答案

鉴于您必须执行此客户端操作,我更喜欢 JavaScript/jQuery 和 AJAX 而不是该方法。下面是如何操作的示例。

本质上,您只是设置了一个 AJAX 调用来轮询一个脚本,该脚本返回(以 JSON 格式)用户是否登录;如果不是,那么您可以将它们转移到另一个页面。

这种方法的好处是你可以随时轮询;例如每 10 秒查看用户是否仍处于登录状态,而不必等待整整一个小时。这也意味着您不需要在代码中声明 session 超时数字,因此您可以将其留给 IIS 来确定。此外,如果用户在您系统的其他地方注销,或者您的应用程序池被回收并且他们的 session 被重置,这将很快检测到它。

我从您的个人资料中注意到您是狗仔队摄影师。我认为这是 DSLR 方法,响应 header 方法是廉价手机摄像头方法 :o。

要构建您的 session 检查器页面,请创建一个名为 session.asp 的文件(与其他文件位于同一文件夹中以简化操作)。放在里面:

<%
Response.ContentType = "application/json"
If Session("LoggedOn") Then
   Response.Write "{""loggedOn"": true}"
Else
   Response.Write "{""loggedOn"": false}"
End If
%>

如果用户已登录,则返回 {"loggedOn": true},如果未登录,则返回 {"loggedOn": false}。这就是我们将在您的其他页面上使用的内容,通过定期调用此页面并阅读响应来轮询他们是否已登录。

现在进入您最初包含 Response.AddHeader 代码的页面。删除所有代码,因为它会替换它。

首先确保您的页面上有对 jQuery 的引用:

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>

然后在这一行下面加上:

<script type="text/javascript">
    $(document).ready(function() {

        var checkLoggedOn = function() {
            $.getJSON('session.asp', function(data) {
                if (!data.loggedOn)
                    window.location.replace("http://stackoverflow.com");
            });
        };

        // Call checkLoggedOn every x milliseconds
        setInterval(checkLoggedOn, 30000);
    });
</script>

如果一切顺利,它应该可以工作。我将上面的设置设置为每 30 秒 (30000) 轮询一次,但您可以将其增加/减少到您想要的任何值。

请注意,我从 https://stackoverflow.com/a/4928564/171703 借用了大部分代码和 https://stackoverflow.com/a/2709160/171703 .


更新:

根据下面的评论,如果您希望用户的 session 在超时数字之后过期(无论他们是否保持 session 事件),那么您可以这样做。

当用户登录时,为 LoginExpiration 设置一个新的 session 变量:

Session("LoginExpiration") = DateAdd("n", Session.TimeOut, Now())

这需要当前时间并向其添加 session 超时数字 - 为您提供他们的 session 应该被销毁的时间。

如果您现在将 session.asp 修改为以下内容,它会获取 LoginExpiration 数字并返回用户未登录的情况:

  1. 用户 session 超时(IIS 应用程序池重置,或者他们单击注销等)
  2. 当前日期/时间大于设置的LoginExpiration时间

这是:

<%
Response.ContentType = "application/json"

LoggedOn = "false"
LoginExpiration = Session("LoginExpiration")
DateNow = Now()

If IsDate(LoginExpiration) Then
    If DateNow < LoginExpiration Then
        LoggedOn = "true"
    End If
End If

Response.Write "{"
    Response.Write """loggedOn"": " & LoggedOn & ", "
    Response.Write """loginExpiration"": """ & LoginExpiration & """"
Response.Write "}"
%>

我已将 loginExpiration 数据放入 JSON 响应中,因此您也可以根据需要在客户端使用它。

关于asp-classic - 经典 ASP/ session 结束重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8770868/

相关文章:

c# - 在ASP中显示实时图的有效方法

javascript - 使用 VBScript Classic ASP 页面中的 JavaScriptalert()

css - 表格 css 的 .asp 循环

c# - 无法从 vbscript 调用 c# 代码 - ActiveX 错误

excel - 在 Excel vbscript 中创建包含当前文件夹名称的新 Excel 文件

javascript - 如何让单引号保留在变量中?

apache - Linux Chilisoft 替换上的 ASP(经典)

utf-8 - 经典 ASP - 如何将 UTF-8 字符串转换为 UCS-2?

javascript - 用 JavaScript 伪造一个 VbScript 数组

vbscript - 如果原始文件已被删除,是否可以恢复正在运行的 VBScript 文件?