0

我有以下问题

我使用过滤器使用户能够导航到授权页面,否则它会派生到索引。

显而易见,但必须说,一个浏览器一个会话。此外,当用户关闭浏览器或标签时,他的会话过期。

当用户打开新选项卡并关闭其中一个选项卡时会出现问题,这意味着会话无效并且其他选项卡不会重定向到索引,因为它没有 ajax 事件。

我测试的解决方案之一。

这是 servlet 中的代码,但没有解释它是如何实现的。

    public void trackUserTabs() {
    String onload = Controller.getParameter(ONLOAD_ID);
    if (onload != null && onload.trim().equals("true")) {
        openedTabs++;
        System.err.println("onload: " + controller.getCurrentPrinciple() + "..........." + openedTabs);
    }
    String onunload = Controller.getParameter(ONUNLOAD_ID);
    if (onunload != null && onunload.trim().equals("true")) {
        openedTabs--;
        System.err.println("onunload: " + controller.getCurrentPrinciple() + ".............." + openedTabs);
    }
    if (openedTabs <= 0 && controller.getCurrentProfile() != null) {
        /**
         * All tabs are closed, log out current user.
         */
        controller.logoutCurrentProfile();
    }

但它有一个细节,我可能不知道用户何时关闭浏览器或选项卡。

另一种解决方案。

  • 使用轮询在 javascript 中调用函数并询问是否已记录。尝试使用此功能,但没有积极的结果。

    function ComprobarSessionExpirada() {
    
    var request = false;
    if(window.XMLHttpRequest) { // Mozilla/Safari
        request = new XMLHttpRequest();
    } else if(window.ActiveXObject) { // IE
        request = new ActiveXObject("Microsoft.XMLHTTP");
    }
    var url = '/ACP_3.0/pag/resumen.jsf';
    request.open('POST', url, true);
    request.onreadystatechange = function() {
        alert('a');
        if(request.readyState == 4) {
            var session = eval('(' + request.responseText + ')');
            if(session.valid) {
                alert('ok');
                // DO SOMETHING IF SESSION IS VALID
            } else {
                alert('Your Session has expired');
                window.location = '/ACP_3.0/index.jsf';
            }
        }
    }
    request.send(null);
    }
    

编辑:

我忘了提到我在应用程序的 bean 中维护用户信息,这可以让我知道我进行的聊天的用户状态。

因此,您需要识别用户何时直接(注销)或间接(关闭浏览器或超时​​)关闭会话,因为如果不关闭会话,则用户的状态始终保持在线。

为了识别他什么时候下线,我使用了破坏会话的前奏。实现 HttpSessionListener 方法 sessionDestroyed 在应用程序 bean 中更改用户的状态。

4

1 回答 1

0

我可能不是唯一一个这样认为的人。不要试图将会话绑定到选项卡,浏览器不是出于某种目的而设计的。

大多数正常用例都会受到关闭选项卡时会话将终止的设计的影响。如果用户不小心关闭了他的最后一个标签怎么办?

于 2013-01-10T08:15:09.763 回答