zoukankan      html  css  js  c++  java
  • 同一账号在不同浏览器不能同时登录

    用的是首先到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
  • 相关阅读:
    谷歌浏览器禁用缓存
    web项目中各种路径的获取
    visual studio 2015常用快捷键
    Jquery实际应用,判断radio,selelct,checkbox是否选中及选中的值
    JQuery获取浏览器窗口的可视区域高度和宽度,滚动条高度
    OAuth学习总结
    今日技术碎片
    碎片化的一天
    软件架构简史
    竞态条件概念
  • 原文地址:https://www.cnblogs.com/songStar/p/10974723.html
Copyright © 2011-2022 走看看