Oto rozwiązanie zapobiegające ścinaniu sesji między kartami przeglądarki w przypadku aplikacji Java. To zadziała dla IE (JSP / Servlet)
- Na pierwszej stronie JSP zdarzenie onload wywołuje aplet (wywołanie ajex), aby ustawić „window.title” i moduł śledzenia zdarzeń w sesji (tylko zmienna całkowita, która za pierwszym razem ma być ustawiona na 0)
- Upewnij się, że żadna z pozostałych stron nie ustawiła pliku window.title
- Wszystkie strony (w tym pierwsza strona) dodają skrypt java, aby sprawdzić tytuł okna po zakończeniu ładowania strony. jeśli tytuł nie zostanie znaleziony, zamknij bieżącą stronę / kartę (pamiętaj, aby cofnąć funkcję „window.unload” w takim przypadku)
- Ustaw page window.onunload zdarzenie skryptu java (dla wszystkich stron), aby przechwytywało zdarzenie odświeżania strony, jeśli strona została odświeżona, wywołaj serwlet, aby zresetować moduł śledzenia zdarzeń.
1) pierwsza strona 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) wspólny JS dla wszystkich stron
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 - mapowanie serwletów
<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) kod serwletu
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");
}
}