我们的网站在管理用户登录上一般都需要一个账号只能有一个人登录,那怎么才能实现呢?这里我介绍一种我在项目中使用的方法。用ServletContext实现。
首先我把思路分析一下:
1、用户登录成功以后,将此sessionid保存到ServletContext,在ServletContext中KEY值使用用户名,VALUE值使用当前的sessionid。
2、登录以后用户每次请求时,在拦截器中首先判断session是否过期,如果没有过期判断ServletContext中的sessionid是否是当前的sessionid,如果不是,说明该账号在其他地方登录。
一、用户登录以后将用户信息customerInfo放入SESSION中
request.getSession(true).setAttribute("customerInfo", customerInfo);
二、将登录成功客户的SESSIONID保存到上下文ServletContext中
因为上下文ServletContext是整个web项目共享的对象,所以每个请求都一个
String sessionId = session.getId();
ServletContext servletContext = request.getServletContext();
servletContext.setAttribute(loginName, sessionId);
三、在拦截器中判断session是否过期,ServletContext的sessionid是否已经被别人更新
CustomerInfoDto customerInfo = (CustomerInfoDto) session.getAttribute("customerInfo");
if(customerInfo == null) {
StringBuffer json = new StringBuffer();
String requestType =(String) request.getHeader("X-Requested-With");
if (requestType != null && requestType.equals("XMLHttpRequest")) {
response.setContentType("application/json;charset=UTF-8");
json.append("{\"resultCode\":\"1\",\"resultMsg\":\"长时间未操作,请重新登录\"}");
PrintWriter pw = response.getWriter();
pw.print(json.toString());
pw.close();
}else{
response.sendRedirect(request.getContextPath() + "/login");
}
return false;
}else{
ServletContext servletContext = request.getServletContext();
String loginSessionID = (String) servletContext.getAttribute(customerInfo.getLoginName());
if(session.getId().equals(loginSessionID)){
return true;
}else{
String requestType =(String) request.getHeader("X-Requested-With");
if (requestType != null && requestType.equals("XMLHttpRequest")) {
response.setContentType("application/json;charset=UTF-8");
PrintWriter pw = response.getWriter();
pw.print("{\"resultCode\":\"1\",\"resultMsg\":\"该账号已在其它地方登录!\"}");
pw.close();
}else{
response.sendRedirect(request.getContextPath() + "/login?error=1");
}
}
}
这里有三个知识点需要注意:
1、拦截器在web.xml中的配置?
2、session的获取和存值方式?
3、ServletContext的获取和存值方式?