检测用户会话何时过期

4

有人能告诉我如何在asp中检测用户会话何时过期吗?

一旦会话过期,我想将用户重定向到已注销的页面。

谢谢 Sp

3个回答

1

我想你需要在网站的一组页面上实现会话检查,因此一个好的方法是为所有“受限访问”页面声明一个基类。 类似于:

public class BasePage : System.Web.UI.Page
{
    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);

        if (Session["Context"] == null) 
        {
            // do redirect
        }
    }
}

假设在登录时,您将分配一个代表会话的对象到Session["Context"]

您的页面将继承此类:

public partial class _Default : BasePage { ... }

0
在您的global.asax文件中使用Session_End()函数。请参见此处以获取更多信息。

SO - Session End

编辑:不,那可能行不通。请参见下面的评论。

如果您必须在会话过期时重定向,那么像这样的东西是否适合您?

private void Page_Load(object sender, System.EventArgs e)
{ 

Response.AddHeader(“Refresh”,Convert.ToString((Session.Timeout * 60) + 5)); 
if(Session[“IsUserValid”].ToString()==””) 
Server.Transfer(“Relogin.aspx”);

}

编辑2:注意,如果您有AJAX内容,则可能会变得棘手。

我看到过一些示例,人们将其放在基本页面的page_load中,并从此基本页面继承所有的.aspx页面。这样可以避免您为每个页面都添加此代码。

为什么第一种方法不起作用(Session_End)?这是在会话结束时服务器内部调用的函数。因此,没有相关的请求/响应进行重定向或传输。也就是说,服务器可能在关闭浏览器20分钟后调用此函数。


1
Session_End 用于清理会话变量,不用于将用户重定向到其他页面。 - Amitabh
@Amitabh 我认为他是指 global.aspx 中的函数 - Steven
1
不,他是对的,我错了。更新帖子,提供另一种解决方案。 - Tommy
另外,请注意,只有在使用InProc时,Session_End事件才会触发。如果您稍后切换到StateServer或SqlServer,这里的代码将不会运行。 - Dominic Zukiewicz

0
你可以检查HttpContext.Current.User.Identity.IsAuthenticated属性,这将允许你知道当前是否有已经被认证的用户。
所以在页面加载时。
if (!HttpContext.Current.User.Identity.IsAuthenticated)
            {
                //FormsAuthentication.RedirectToLoginPage();
                Response.Redirect("~/Login.aspx");
            }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接