1

我正在创建一个用户无法尝试多次登录的应用程序。如果特定用户登录,我的数据库标志将设置为1,这意味着没有其他具有相同用户名和密码的成员可以登录。

如果用户注销我的数据库标志值设置为 0。一切正常,但现在我有一个不同的问题,即当用户突然关闭浏览器而没有注销页面会话超时时,应自动设置数据库标志值为 0。

我正在搜索一些文章说它可以使用 global.asax 文件发生。我试过了,但到目前为止什么也没发生。请问你能帮我吗?

4

2 回答 2

4

检测用户关闭浏览器窗口的唯一安全方法是通过检测信号。也就是说,浏览器不断向服务器发送请求,让它知道它还活着。由于 ASP.net 会跟踪会话,因此它将在检测到不活动后调用您的会话结束处理程序。

因此,如果您将会话超时设置为一分钟,并且每 45 秒发送一次请求,您的会话结束处理程序将被调用,最多延迟一分钟

于 2012-10-20T20:44:04.953 回答
2

注意:关闭浏览器不会自动触发 Session_End 事件。Session_End 事件将在会话过期一定时间后触发 - 此超时值在 IIS 中设置 - 默认设置为 20 分钟。将用户设置为非活动状态的唯一方法是依靠 JavaScript 向结束会话的 Web 方法发出 ajax 请求。

  1. 在 Web 应用程序的根目录中创建一个新的全局应用程序类 (global.ascx) 文件。为此,请在 Visual Studio 的解决方案资源管理器中右键单击您的网站项目节点,然后选择“添加 - > 新项目”

您将看到以下对话框(在 Visual Studio 2010 中 - 其他版本类似)
在此处输入图像描述

  1. 单击添加并查看新的 global.asax 文件的代码隐藏。
  2. 您现在应该看到一个包含一些事件的文件,其中之一是Session_End. 将结束用户会话的任何代码放在这里:

    protected void Session_End(object sender, EventArgs e)
    {
        // put your code that logs a user out here
    }
    
  3. 为了确保会话在用户关闭浏览器时结束,您需要依赖 JavaScript注意如果用户关闭了 JavaScript,这将不起作用。 在网站的每个页面上,您都需要添加如下内容:

    window.onbeforeunload = function () {
    
        // write an ajax call to a Web Method on your site that ends the session
    
    }
    
于 2012-10-20T20:13:36.990 回答