经典ASP /会话结束重定向

问题描述 投票:2回答:2

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

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

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

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

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

asp-classic vbscript
2个回答
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
%>

如果用户已登录,则返回{“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/171703https://stackoverflow.com/a/2709160/171703借用了上面代码的大部分内容。


更新:

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

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

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

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

如果您现在将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 "}"
%>

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


0
投票
'If the session variable is False or does not exist (IsNull)
'then redirect the user to the unauthorised user page
If Session("accountID") = False or IsNull(Session("accountID")) = True then
 'Redirect to unathorised user page
 Response.Redirect "pagename.asp"
End If 

将其放在您需要保护的所有页面中包含的包含文件中。

<%@LANGUAGE="VBSCRIPT"%>
<!--#include file="checkmem.asp"-->
<!--#include file="includes/dtdsql.asp" -->
<!--#include file="includes/functions.asp" -->
© www.soinside.com 2019 - 2024. All rights reserved.