经典ASP /会话结束重定向

The*_*ver 2 vbscript asp-classic

我想在用户会话到期时自动重定向到登录页面.

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

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
Run Code Online (Sandbox Code Playgroud)

这有效,但有一个非常轻微的错误.即使会话仍然存在,页面也会不时刷新,并且它似乎在60分钟之前刷新!

任何人都可以看到问题是什么,或者你可以建议一个不同的方法?

aki*_*ler 6

看起来好像你必须做这个客户端我喜欢JavaScript/jQuery和AJAX这个方法.这是一个如何做到这一点的例子.

基本上你只是设置一个AJAX调用来轮询一个脚本,该脚本返回(采用JSON格式)用户是否登录; 如果他们不是那么你可以将他们转移到另一页.

这种方法的好处是你可以随时进行轮询; 例如,每10秒钟查看用户是否仍然登录而不必等待整整一个小时.这也意味着您不需要在代码中声明会话超时数字,因此您可以将其保留在IIS中.此外,如果用户在系统中的其他位置注销,或者您的应用程序池已回收并且其会话已重置,则会很快检测到它.

我从你的个人资料中注意到你是一名狗仔队的摄影师.我认为这是DSLR方法和响应头方法的廉价手机摄像头方法:o.

要构建会话检查器页面,请创建一个名为session.asp的文件(与其他文件位于同一文件夹中,以简化生活).在它放:

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

如果用户已登录,则返回{"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>
Run Code Online (Sandbox Code Playgroud)

然后将以下内容放在此行下:

<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>
Run Code Online (Sandbox Code Playgroud)

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

注意我从/sf/answers/344999511//sf/answers/189641231/借用了上面代码的大部分内容.


更新:

从下面的评论中,如果您希望用户的会话在超时数字后过期(无论他们是否保持会话活动),那么您可以这样做.

用户登录后,为LoginExpiration设置一个新的会话变量:

Session("LoginExpiration") = DateAdd("n", Session.TimeOut, Now())
Run Code Online (Sandbox Code Playgroud)

这需要占用当前时间并将会话超时数字添​​加到其中 - 为您提供销毁其会话的时间.

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

  1. 用户会话已超时(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 "}"
%>
Run Code Online (Sandbox Code Playgroud)

我已将loginExpiration数字放入JSON响应中,因此如果您也需要,可以使用客户端.