因为目前项目是基于session来判断当前用户的详细情况,从一致性和可靠性来考虑,应该确保一个session一个用户。
在网上看了一些文章及经验,最后在项目中采用了cookie+session来控制的这种方法。现总结如下:
1、概念理解:cookie保存在客户端,session保存在服务器。一个线程一个session(不知道对不对,请指教)。但是,一个浏览器多个标签共用一个session的 。
2、登陆控制:
(1)在index.html上先判断浏览器是否支持cookie,若不支持则不能commit。
(2)在登陆Service类中判断(读取之前保存在cookie的SESSIONID是否与getSeesion()一致):
String sessionID = request.getSession().getId();
Cookie[] webCookie = request.getCookies();
for(int i=0;i<webCookie.length;i++){
if("SESSIONID".equals(webCookie[i].getName()) && sessionID.equals(webCookie[i].getValue())){
action.addMessage("已登陆其他用户!请【安全退出】再登陆!");
return false;
}
}
若登陆成功,将SessionID写入客户端的cookie:
Cookie cookie = new Cookie("SESSIONID",sessionID);
httpServletResponse.addCookie(cookie);
(3)由(1)(2)保证了一个用户对于一个Session,现在需要就是针对各种情况销毁Session。
这里主要考虑的是关闭浏览器时销毁sessoin。
//关闭浏览器销毁Seesion
var xmlHttp;
function createXMLHttpRequest()
{
//IE
if (window.ActiveXObject)
{
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
//Other
else if (window.XMLHttpRequest)
{
xmlHttp = new XMLHttpRequest();
}
}
function destorySession()
{
try{
createXMLHttpRequest();
var url = "destorysession.jsp";
xmlHttp.open("POST", url, false);
xmlHttp.send(null);
var result = xmlHttp.responseText;
}
catch(e)
{
alert("销毁Session异常!");
}
}
destorysession.jsp:
<%@page contentType="text/html; charset=UTF-8"%>
<html>
<head>
<title></title>
<body>
<%session.invalidate (); %>
</body>
</html>