Hier ist eine Lösung, um das Scheren von Sitzungen zwischen Browser-Registerkarten für eine Java-Anwendung zu verhindern. Dies funktioniert für IE (JSP / Servlet)
- Auf Ihrer ersten JSP-Seite rufen Sie beim Laden eines Ereignisses ein Servlet (Ajex-Aufruf) auf, um eine "window.title" und einen Ereignis-Tracker in der Sitzung einzurichten (nur eine ganzzahlige Variable, die zum ersten Mal als 0 festgelegt wird).
- Stellen Sie sicher, dass auf keiner der anderen Seiten ein window.title festgelegt ist
- Alle Seiten (einschließlich der ersten Seite) fügen ein Java-Skript hinzu, um den Fenstertitel zu überprüfen, sobald das Laden der Seite abgeschlossen ist. Wenn der Titel nicht gefunden wird, schließen Sie die aktuelle Seite / Registerkarte (stellen Sie sicher, dass die Funktion "window.unload" in diesem Fall rückgängig gemacht wird).
- Legen Sie das Java-Skriptereignis page window.onunload fest (für alle Seiten), um das Seitenaktualisierungsereignis zu erfassen. Wenn eine Seite aktualisiert wurde, rufen Sie das Servlet auf, um den Ereignistracker zurückzusetzen.
1) erste Seite JS
BODY onload="javascript:initPageLoad()"
function initPageLoad() {
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");
}
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { var serverResponse = xmlhttp.responseText;
top.document.title=serverResponse;
}
};
xmlhttp.open("GET", 'data.do', true);
xmlhttp.send();
}
2) gemeinsames JS für alle Seiten
window.onunload = function() {
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");
}
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
var serverResponse = xmlhttp.responseText;
}
};
xmlhttp.open("GET", 'data.do?reset=true', true);
xmlhttp.send();
}
var readyStateCheckInterval = setInterval(function() {
if (document.readyState === "complete") {
init();
clearInterval(readyStateCheckInterval);
}}, 10);
function init(){
if(document.title==""){
window.onunload=function() {};
window.open('', '_self', ''); window.close();
}
}
3) web.xml - Servlet-Zuordnung
<servlet-mapping>
<servlet-name>myAction</servlet-name>
<url-pattern>/data.do</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>myAction</servlet-name>
<servlet-class>xx.xxx.MyAction</servlet-class>
</servlet>
4) Servlet-Code
public class MyAction extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException {
Integer sessionCount = (Integer) request.getSession().getAttribute(
"sessionCount");
PrintWriter out = response.getWriter();
Boolean reset = Boolean.valueOf(request.getParameter("reset"));
if (reset)
sessionCount = new Integer(0);
else {
if (sessionCount == null || sessionCount == 0) {
out.println("hello Title");
sessionCount = new Integer(0);
}
sessionCount++;
}
request.getSession().setAttribute("sessionCount", sessionCount);
// Set standard HTTP/1.1 no-cache headers.
response.setHeader("Cache-Control", "private, no-store, no-cache, must- revalidate");
// Set standard HTTP/1.0 no-cache header.
response.setHeader("Pragma", "no-cache");
}
}