我有以下问题
我使用过滤器使用户能够导航到授权页面,否则它会派生到索引。
显而易见,但必须说,一个浏览器一个会话。此外,当用户关闭浏览器或标签时,他的会话过期。
当用户打开新选项卡并关闭其中一个选项卡时会出现问题,这意味着会话无效并且其他选项卡不会重定向到索引,因为它没有 ajax 事件。
我测试的解决方案之一。
- 仅在仅存在一个选项卡时注销,因为我将不得不计算某个会话变量或 servlet 变量中的选项卡(在此页面上我阅读了此解决方案,但我不理解此示例...)。
这是 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 中更改用户的状态。