Đây là một giải pháp để ngăn chặn phiên cắt giữa các tab trình duyệt cho một ứng dụng java. Điều này sẽ làm việc cho IE (JSP / Servlet)
- Trong trang JSP đầu tiên của bạn, sự kiện onload gọi một servlet (cuộc gọi ajex) để thiết lập "window.title" và trình theo dõi sự kiện trong phiên (chỉ một biến số nguyên được đặt thành 0 lần đầu tiên)
- Đảm bảo không có trang nào khác đặt window.title
- Tất cả các trang (bao gồm trang đầu tiên) thêm tập lệnh java để kiểm tra tiêu đề cửa sổ sau khi quá trình tải trang hoàn tất. nếu không tìm thấy tiêu đề thì hãy đóng trang / tab hiện tại (đảm bảo hoàn tác chức năng "window.unload" khi điều này xảy ra)
- Đặt trang window.onunload java script event (cho tất cả các trang) để chụp sự kiện làm mới trang, nếu một trang đã được làm mới, hãy gọi servlet để đặt lại trình theo dõi sự kiện.
1) trang đầu tiên
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) JS chung cho tất cả các trang
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 - ánh xạ servlet
<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) mã dịch vụ
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");
}
}