おそらくこれは遅すぎますが、これに関連するウェブ上で多くの質問を見たので、クロムとファイアフォックスでテストしたソリューションをここに置くことができます(ただし、すべての最新版)
セットで: より洗練された解決策はフィルターを使用することですが、私は prerender イベントを使用しました (Web サイト全体に単一のテンプレートを使用するため、すべてのページがいつ読み込まれるかを追跡でき、テンプレートで prerender イベントを指定しました)。
Javascript セクション:
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 の回答を参考にしています。