用的是首先到map(存到一級緩存)里面去找是否有當前賬號,如果沒有則加入map,參數是賬號和sessionid,如果有賬號則判斷sessionid是否相同,如果不相同則刪除之前的賬號,加入新的賬號和sessionId
1.在登陸的時候判斷當前用戶有么有在其他瀏覽器登陸,如果有登陸則把之前的瀏覽器的賬號進行登出

1 // 登錄成功,保存當前用戶登錄的sessionId 2 String sessionID = request.getRequestedSessionId(); 3 String userAccount = userLoginRsp.getUserAccount(); 4 if (!SessionSave.getSessionIdSave().containsKey(userAccount)) { 5 SessionSave.getSessionIdSave().put(userAccount, sessionID); 6 }else if(SessionSave.getSessionIdSave().containsKey(userAccount)&&!sessionID.equals(SessionSave.getSessionIdSave().get(userAccount))){ 7 SessionSave.getSessionIdSave().remove(userAccount); 8 SessionSave.getSessionIdSave().put(userAccount, sessionID); 9 }
2.在其他頁面進行請求的時候進行監聽過濾、攔截是否該賬號在其他的瀏覽器重新登陸,如果重新登陸,則該頁面的請求終止跳轉到首頁
在過濾器和攔截器中判斷當前map的sessionid和當前sessionid是否相同,如果不同,之前的sessionId被登出
在servlet-context.xml配置攔截器

1 <!-- 攔截器 --> 2 <mvc:interceptors> 3 <!-- 登錄攔截 --> 4 <mvc:interceptor> 5 <mvc:mapping path="/**"/> 6 <bean class="com.gta.scm.common.login.LoginInterceptor" /> 7 </mvc:interceptor> 8 </mvc:interceptors>
在web.xml中配置過濾器
<!-- 過濾JSP頁面,處理session過期用途 -->

<filter> <filter-name>sessionFilter</filter-name> <filter-class>com.gta.scm.common.login.CheckSessionFilter</filter-class> </filter> <filter-mapping> <filter-name>sessionFilter</filter-name> <url-pattern>*.jsp</url-pattern> </filter-mapping>
過濾器具體實現

1 public class CheckSessionFilter implements Filter { 2 3 @Override 4 public void destroy() { 5 // TODO Auto-generated method stub 6 7 } 8 9 @Override 10 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) 11 throws IOException, ServletException { 12 13 HttpServletRequest request = (HttpServletRequest) servletRequest; 14 HttpServletResponse response = (HttpServletResponse) servletResponse; 15 HttpSession session = request.getSession(); 16 request.setCharacterEncoding("UTF-8"); 17 response.setCharacterEncoding("UTF-8"); 18 response.setContentType("text/html;charset=UTF-8"); 19 20 // 后台session控制 ,無需登錄,允許訪問的地址 21 String[] allowUrls = new String[] {"/page/login/loginHelp.jsp","/page/login/login.jsp","/page/common/sessionrun.jsp","page/common/sessionOut.jsp"}; 22 //獲取請求地址 23 String url = request.getServletPath().toString(); 24 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/"; 25 UserLoginRsp user =(UserLoginRsp) session.getAttribute("user"); 26 //System.out.println(url); 27 boolean b = false; 28 for (String strUrl : allowUrls) { 29 if(url.contains(strUrl)) 30 { 31 b = true; 32 break; 33 } 34 } 35 if(!b){ 36 //獲得session中的用戶 37 boolean buser = true; 38 try { 39 if(null == user){ 40 buser = false; 41 42 } 43 44 } catch (Exception e) { 45 buser = false; 46 } 47 if(!buser){ 48 // 未登錄 49 /*Map<String, HttpSession> map=LoginListenner.getMap(); 50 if(map!=null&&map.size()>0) 51 { 52 if() 53 response.sendRedirect(basePath + "page/common/sessionOut.jsp");//重定向到指定的錯誤界面 54 } 55 else 56 {*/ 57 response.sendRedirect(basePath + "page/common/sessionrun.jsp");//重定向到指定的錯誤界面 58 /*}*/ 59 return ; 60 }else{ 61 String sessionId = SessionSave.getSessionIdSave().get(user.getUserAccount());//獲取全局類SessionSave保存賬戶的靜態sessionId 62 String currentSessionId = session.getId();//獲取當前的sessionId 63 if (!currentSessionId.equals(sessionId)) {//如果兩個sessionId不等,則當前賬戶強制下線,需要重新登錄 64 response.sendRedirect(basePath + "page/common/sessionOut.jsp");//重定向到指定的強制登陸頁面 65 }else {// 如果是同一賬戶session則放行請求 66 67 filterChain.doFilter(servletRequest, servletResponse); 68 return; 69 } 70 } 71 }else{ 72 filterChain.doFilter(servletRequest, servletResponse); 73 return; 74 } 75 76 } 77 78 @Override 79 public void init(FilterConfig arg0) throws ServletException { 80 // TODO Auto-generated method stub 81 82 } 83 84 }
攔截器具體實現

1 public class LoginInterceptor implements HandlerInterceptor { 2 3 @Override 4 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) 5 throws Exception { 6 //創建session 7 HttpSession session =request.getSession(); 8 9 request.setCharacterEncoding("UTF-8"); 10 response.setCharacterEncoding("UTF-8"); 11 response.setContentType("text/html;charset=UTF-8"); 12 13 // 后台session控制 ,無需登錄,允許訪問的地址 14 String[] allowUrls = new String[] { "login/loginInfo", "login/doLogin","login/loginOut","login/sessionLoginRun","page/common/sessionOut.jsp" }; 15 //獲取請求地址 16 String url = request.getServletPath().toString(); 17 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/"; 18 System.out.println(url); 19 for (String strUrl : allowUrls) { 20 if(url.contains(strUrl)) 21 { 22 return true; 23 } 24 } 25 boolean b = true; 26 //獲得session中的用戶 27 try { 28 UserLoginRsp user =(UserLoginRsp) session.getAttribute("user"); 29 if(null == user){ 30 b = false; 31 /** 32 * 攔截目錄下請求,是否為ajax請求 33 * 是:無需登錄,直接訪問(因為我是用於首頁的ajax登錄請求) 34 * 否:跳轉至登錄界面 35 */ 36 if (request.getHeader("x-requested-with") != null && request.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")){ 37 /*Map<String, HttpSession> map=LoginListenner.getMap(); 38 if(map!=null&&map.size()>0) 39 { 40 response.getWriter().write("該賬號已在其它地方登錄,請重新登錄!"); 41 42 } 43 else 44 {*/ 45 response.getWriter().write("登錄超時"); 46 /*}*/ 47 return false; 48 } 49 } 50 else 51 { 52 String sessionId = SessionSave.getSessionIdSave().get(user.getUserAccount());//獲取全局類SessionSave保存賬戶的靜態sessionId 53 String currentSessionId = session.getId();//獲取當前的sessionId 54 if (!currentSessionId.equals(sessionId)) {//如果兩個sessionId不等,則當前賬戶強制下線,需要重新登錄 55 response.sendRedirect(basePath + "page/common/sessionOut.jsp");//重定向到指定的強制登陸頁面 56 } 57 // 如果是同一賬戶session則放行請求 58 } 59 60 } catch (Exception e) { 61 b = false; 62 } 63 if(!b){ 64 // 未登錄 65 /*Map<String, HttpSession> map=LoginListenner.getMap(); 66 if(map!=null&&map.size()>0) 67 { 68 response.sendRedirect(basePath + "page/common/sessionOut.jsp");//重定向到指定的錯誤界面 69 } 70 else 71 {*/ 72 response.sendRedirect(basePath + "page/common/sessionrun.jsp");//重定向到指定的錯誤界面 73 /*}*/ 74 return false; 75 } 76 return b; 77 78 } 79 80 @Override 81 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, 82 ModelAndView modelAndView) throws Exception { 83 // TODO Auto-generated method stub 84 85 } 86 87 @Override 88 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) 89 throws Exception { 90 // TODO Auto-generated method stub 91 92 } 93 94 }
添加SessionSave類,存儲靜態map

1 public class SessionSave { 2 private static Map<String, String> SessionIdSave = new HashMap<String,String>(); 3 4 public static Map<String, String> getSessionIdSave() { 5 return SessionIdSave; 6 } 7 8 public static void setSessionIdSave(Map<String, String> sessionIdSave) { 9 SessionIdSave = sessionIdSave; 10 } 11 12 13 }