นี่เป็นวิธีการป้องกันการตัดเซสชันระหว่างแท็บเบราว์เซอร์สำหรับแอปพลิเคชัน Java สิ่งนี้จะใช้ได้กับ IE (JSP / Servlet)
- ในหน้า JSP แรกของคุณเหตุการณ์ onload เรียก servlet (ajex call) เพื่อตั้งค่า "window.title" และตัวติดตามเหตุการณ์ในเซสชัน (เพียงตัวแปรจำนวนเต็มที่ตั้งเป็น 0 ครั้งแรก)
- ตรวจสอบให้แน่ใจว่าไม่มีหน้าอื่น ๆ ตั้งค่า window.title
- หน้าทั้งหมด (รวมถึงหน้าแรก) เพิ่มจาวาสคริปต์เพื่อตรวจสอบชื่อหน้าต่างเมื่อการโหลดหน้าเสร็จสมบูรณ์ หากไม่พบชื่อเรื่องให้ปิดหน้า / แท็บปัจจุบัน (ให้แน่ใจว่าได้เลิกทำฟังก์ชั่น "window.unload" เมื่อสิ่งนี้เกิดขึ้น)
- ตั้งค่าหน้าหน้าต่างให้โหลดเหตุการณ์สคริปต์ java (สำหรับทุกหน้า) เพื่อจับภาพเหตุการณ์การรีเฟรชหน้าหากมีการรีเฟรชหน้าแล้วให้โทรเซิร์ฟเล็ตเพื่อรีเซ็ตตัวติดตามเหตุการณ์
1) หน้าแรก 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) JS ทั่วไปสำหรับทุกหน้า
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-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
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");
}
}