【问题标题】:asp.net is there a way to trigger Session_End like event when cookie expires?asp.net 有没有办法在 cookie 过期时触发 Session_End 之类的事件?
【发布时间】:2015-05-04 02:32:16
【问题描述】:

希望这不是一个太基本的问题。我想知道就像会话过期时触发 Session_end 事件一样,有没有办法在使用表单身份验证和 cookie 过期时触发任何事件?或者是否有可能找出 cookie 何时过期(而不是在发出新请求时)然后采取自定义操作?

提前致谢

【问题讨论】:

    标签: asp.net session cookies


    【解决方案1】:

    我认为没有直接的方法可以知道这一点。我们使用在母版页上执行此 JavaScript hack。请注意,这是手动设置 cookieExpiryTime。

    var timeoutID,
        cookieExpiryTime = 20 * 60 * 60; //20 minutes
    function HandleSessionExpiry() {
        timeoutID = window.setTimeout(function () {
            window.location.href = 'http://www.example.com/Login.aspx?action=logout';
        }, cookieExpiryTime);
    }
    
    window.onload = HandleSessionExpiry;
    

    如果页面没有发出任何 AJAX 请求,这可以正常工作,但如果有 AJAX 请求,我们需要在全局 ajaxStart 和 ajaxStop 上编写两个函数。 (这里使用 jQuery)

    $(document).ajaxStart(function () {
        window.clearTimeout(timeoutID);
    });
    $(document).ajaxStop(function () {
        HandleSessionExpiry();
    });
    

    还有我们这样做的 Login.aspx 的 Page_Load。

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            if(! String.IsNullOrEmpty(Request.QueryString["!action"]) 
                && Request.QueryString["!action"] == "logout")
            {
                Session.Abandon();
            }
        }
    }
    

    【讨论】:

    • 这是非常丑陋的黑客。最好进行 Ajax 调用以了解会话是否已过期。
    • @Aniket,我想看看那个代码。 setInterval 对我来说似乎是唯一的方法。您是否建议每秒使用一次 setTimeout 调用来进行 ajax 调用以检查会话是否已过期?
    • 我建议在启动实际回发之前扩展或挂钩__doPostBack 以检查会话是否已过期。
    • 是的,我读到了另一个关于在渲染页面上编写它的技巧。虽然在 ajax 调用上似乎不起作用
    • 但这只是 Inproc 会话的问题。一些 SessionState 提供程序,基于 Azure Cache 的 IIRC Microsoft Azure SessionState 提供程序似乎允许滑动过期。
    猜你喜欢
    • 1970-01-01
    • 2021-08-30
    • 2023-03-06
    • 1970-01-01
    • 2014-06-06
    • 1970-01-01
    • 1970-01-01
    • 2017-08-05
    • 2011-04-30
    相关资源
    最近更新 更多