我想在用户会话到期时自动重定向到登录页面。
我一直在我的应用程序中每个页面顶部的包含文件中使用以下代码:
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分钟之前刷新!
任何人都可以看到问题是什么,或者你能建议一种不同的方法吗?
答案 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/171703和https://stackoverflow.com/a/2709160/171703借用了上面代码的大部分内容。
从下面的评论中,如果您希望用户的会话在超时数字后过期(无论他们是否保持会话处于活动状态),那么您可以这样做。
当用户登录时,为LoginExpiration设置一个新的会话变量:
Session("LoginExpiration") = DateAdd("n", Session.TimeOut, Now())
这需要花费当前时间并将会话超时数字添加到其中 - 为您提供应该销毁其会话的时间。
如果您现在将session.asp修改为以下内容,则会获取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响应中,以便您可以在客户端使用它。
答案 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>