在我的Java EE和JSF 2.0应用程序中,我希望当用户关闭应用程序的选项卡时,会话结束。如果此用户已在应用程序中打开另一个选项卡,则不应关闭此其他选项卡的会话。这样就不会干扰应用程序的管理。
要结束会话,请使用:
public String deconnecter() {
//invalidate user session
FacesContext context = FacesContext.getCurrentInstance();
HttpSession session = (HttpSession) context.getExternalContext().getSession(false);
session.invalidate();
return "login";
}
答案 0 :(得分:1)
这不是你想要的方式。同一浏览器实例的所有窗口/选项卡共享同一会话。
无论如何要实现此目的,您需要创建一个带有条件渲染包含的视图和一个视图范围bean,其中存储与视图相关的所有内容,并始终从操作方法返回void
或null
。这样你根本不需要会话范围。要创建新视图,只需发送新的GET请求(如新标签页)或从操作方法返回非null
字符串。
答案 1 :(得分:1)
可能这已经太晚了,但是因为我在网上看到了很多与此有关的问题,我可能只是把我的解决方案放在这里,我已经测试了chrome和firefox(尽管所有最新版本)
On set:更优雅的解决方案是使用过滤器,但我使用了prerender事件(使用单个模板为我的整个网站,因此我可以跟踪每个页面加载时,我已经指定了prerender事件模板)
window.onbeforeunload = function(){
//log out of the server too.
var xmlhttp;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
var url = '/context/index.xhtml?onunload=true';
xmlhttp.open('GET', url, true);
xmlhttp.send();
}
window.onload = function(){
console.log('window name: '+window.name);
if(window.name != '#{controller.sessionId}'){
window.name = '#{controller.sessionId}';
var xmlhttp;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
var url = '/context/index.xhtml?onload=true';
xmlhttp.open('GET', url, true);
xmlhttp.send();
}
}
//Called when user logs out.
function onLogout(){
console.log('logging out: '+window.name);
window.name = '';
console.log('logged out: '+window.name);
}
在prerender事件上呈现视图之前调用此方法
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();
}
}
ajax请求的javascript代码是由Stackoverflow中的答案提供的。