同一賬號在不同瀏覽器不能同時登錄


用的是首先到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             }
View Code

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>
View Code

在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>
View Code

過濾器具體實現

 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 }
View Code

攔截器具體實現

 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 }
View Code

添加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 }
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM