簡體   English   中英

經典 ASP / 會話結束重定向

[英]Classic ASP / End of session redirect

我想在用戶會話過期時自動重定向到登錄頁面。

我一直在位於應用程序每個頁面頂部的包含文件中使用以下代碼:

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 分鍾結束之前刷新!

任何人都可以看到問題所在,或者您可以提出不同的方法嗎?

好像你必須做這個客戶端,我更喜歡 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 響應中,因此您也可以在客戶端使用它。

ASP Global.asa文件可能就是您要查找的文件。 它允許您在某些事件中運行代碼,例如會話開始和結束。 有關更多信息,請參閱https://www.w3schools.com/asp/asp_globalasa.asp ,但我相信以下方法會起作用:

環球網

<script language="vbscript" runat="server">
    sub Session_OnEnd
        Response.Redirect("http://www.example.com/")
    end sub
</script>
'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" -->

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM