【发布时间】:2013-01-10 20:31:35
【问题描述】:
我有以下问题
我使用过滤器使用户能够导航到授权页面,否则它会派生到索引。
很明显,但必须说,一个浏览器一个会话。 此外,当用户关闭浏览器或标签页时,他的会话过期。
当用户打开新选项卡并关闭其中一个选项卡时会出现问题,这意味着会话无效并且其他选项卡没有重定向到索引,因为它没有 ajax 事件。
我测试过的解决方案之一。
- 仅在仅存在一个选项卡时注销,因为我将不得不计算某个会话变量或 servlet 变量 (on this page I read this solution, but i did not understand this example ...) 中的选项卡。
这是 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 改变用户在应用程序中的状态 豆子。
【问题讨论】:
标签: javascript session jsf-2 tabs primefaces