经典ASP /会话结束重定向

时间:2012-01-07 15:47:07

标签: asp-classic vbscript

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

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

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分钟之前刷新!

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

3 个答案:

答案 0 :(得分: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时间
  3. 这是:

    <%
    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响应中,以便您可以在客户端使用它。

答案 1 :(得分: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" -->

答案 2 :(得分:0)

ASP Global.asa 文件可能正是您要找的。它允许您在某些事件中运行代码,例如会话开始和结束。有关详细信息,请参阅 https://www.w3schools.com/asp/asp_globalasa.asp,但我相信以下方法会起作用:

Global.asa

<script language="vbscript" runat="server">
    sub Session_OnEnd
        Response.Redirect("http://www.example.com/")
    end sub
</script>