자바 웹 의 제한 사용자 여러 곳 로그 인 인 인 스 턴 스 코드

7350 단어 자바로그 인
최근 프로젝트 에서 하나의 요 구 를 만 났 습 니 다.한 사용자 가 여러 단말기 에 로그 인 하 는 것 을 제한 하 라 고 요구 합 니 다(예 를 들 어 사용자 가 A 에서 로그 인 한 다음 에 B 에서 로그 인 합 니 다.이때 A 곳 은 오프라인 으로 밀 려 나 야 합 니 다).처음에 저 는 spring 의 security 를 사용 하여 설정 을 통 해 직접 실현 하고 싶 었 습 니 다.간단 하고 편리 합 니 다.그러나 안 타 깝 게 도 제 가 한 프로젝트 는 회사 의 패 키 징 프레임 워 크 를 사용 하고 sprign 2.X 를 사용 하고 있 습 니 다.좋 습 니 다.이 방법 이 통 하지 않 는 다 면 저 는 솔직하게 코드 를 써 서 실현 하 겠 습 니 다.인터넷 에서 실현 하 는 방법 을 생각해 보면 많 을 것 입 니 다.도 모,구 글 이 한 번 걸 으 면 결단력 이 많 지만 과거 에는 똑 같은 느낌 이 들 었 습 니 다.그리고 애플 리 케 이 션 을 사용 하 는 거 야,session 같은 거.마지막 으로,나 는 내 가 직접 해서 먹고 입 는 것 이 풍족 하 다.우선 나 는 나의 생각 을 말 했다.

전역 맵 으로 로그 인 할 때 sessionId 를 저장 합 니 다.Map 의 key 는 로그 인 이름 이 고 value 는 sessionID 입 니 다.나중에 앞 에 있 는 것 을 밀 어 냈 기 때문에 판단 하지 않 고 Map 의 값 을 덮어 쓰 면 됩 니 다.
HttpSession Listener 를 실현 하고 session 이 만 료 되 었 을 때 맵 에 해당 하 는 값 을 지 웁 니 다.
요청 을 차단 하 는 데 사용 되 는 Filter 를 구현 합 니 다.현재 sessionId 가 Map 에 있 는 지 여 부 를 판단 하고 종료 작업 을 수행 하지 않 으 면 종료 합 니 다.
로그 인 한 사용자 SessionID 를 저장 하 는 클래스

public class LoginUserMap {

  private static Map<String, String> loginUsers = new ConcurrentHashMap<String, String>();

  /**
   *     sessionId  map
   * @param key
   * @param value
   */
  public static void setLoginUsers(String loginId, String sessionId) {
    loginUsers.put(loginId, sessionId);
  }

  /**
   *   loginUsers
   * @return
   */
  public static Map<String, String> getLoginUsers() {
    return loginUsers;
  }

  /**
   *   sessionId  map   
   * @param sessionId
   */
  public static void removeUser(String sessionId) {
    for (Map.Entry<String, String> entry : loginUsers.entrySet()) {
      if (sessionId.equals(entry.getValue())) {
        loginUsers.remove(entry.getKey());
        break;
      }
    }
  }

  /**
   *        loginusers 
   * @param loginId
   * @param sessionId
   * @return
   */
  public static boolean isInLoginUsers(String loginId, String sessionId) {
    return (loginUsers.containsKey(loginId) && sessionId.equals(loginUsers.get(loginId)));
  }

}

로그 인 방법 에 session ID 저장
여기 서 저 는 구체 적 인 실현 을 제시 하지 않 겠 습 니 다.서로 다른 프로젝트 가 다 르 기 때문에 저 는 대략적인 절 차 를 써 서 이 해 를 돕 겠 습 니 다.

//         
public void login(ttpServletRequest request) {
  try {  
      ......//        
      HttpSession session = request.getSession();
      LoginUserMap.setLoginUsers(username, session.getId());//  sessionId map 
    } catch (LoginException ex) {
      throw ex;
    }
}
HttpSessionListener 구현

public class SessionListener implements HttpSessionListener {
  private Log log = LogFactory.getLog(SessionListener.class);

  /**
   *   session     
   * @param event
   */
  @Override
  public void sessionCreated(HttpSessionEvent event) {

  }

  /**
   *   session     
   * @param event
   */
  @Override
  public void sessionDestroyed(HttpSessionEvent event) {
    HttpSession session = event.getSession();
    String sessionId = session.getId();
    //  loginUsers       session
    LoginUserMap.removeUser(sessionId);
    log.info(sessionId + "   !");
    }
}

xml 설정 은 다음 과 같 습 니 다:

  <listener>
    <listener-class>io.github.brightloong.loginlimite.SessionListener</listener-class>
  </listener>
필터 구현

public class LoginLimitFilter implements Filter{

  private Log log = LogFactory.getLog(LoginLimitFilter.class);

  /**
   *       
   */
  @Override
  public void destroy() {

  }

  /**
   *     
   * @param request
   * @param response
   * @param filterChain
   * @throws IOException
   * @throws ServletException
   */
  @Override
  public void doFilter(ServletRequest request, ServletResponse response,
     FilterChain filterChain) throws IOException, ServletException {
    HttpServletRequest servletRequest = (HttpServletRequest) request;
    HttpServletResponse servletResponse = (HttpServletResponse) response;
    HttpSession session = servletRequest.getSession();

    //      
    String path = servletRequest.getContextPath(); 
    String basePath = servletRequest.getScheme()+"://"+servletRequest.getServerName()+":"+servletRequest.getServerPort()+path;

    try {
      //      ,           ,     ,         
      IUser user = UserUtils.getCurrUserInfo();
      String loginId = user.getLoginId();
      //       sessionId   loginUsers ,      if    
      if(!LoginUserMap.isInLoginUsers(loginId, session.getId())) {
        //    logout
        logout();//   logout  
        //      ,           
        servletResponse.sendRedirect(basePath + "?logoutway=edge");
      }
    } catch (Exception e) {
      log.debug("          ,     !", e);
    } finally {
      filterChain.doFilter(request, response);
    }
  }

  /**
   *      
   * @param arg0
   * @throws ServletException
   */
  @Override
  public void init(FilterConfig arg0) throws ServletException {

  }

}

xml 설정 은 다음 과 같 습 니 다:

  <filter>
    <filter-name>LoginLimitFilter</filter-name>
    <filter-class>io.github.brightloong.loginlimite.LoginLimitFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>LoginLimitFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
알림 정보 보이 기
사용자 가 클릭 할 때 filter 를 터치 하여 모니터링 합 니 다.로그 인 한 것 을 감지 하면 로그 인 페이지 로 이동 합 니 다.이 럴 때 밀 린 것 인지 아 닌 지 를 판단 하려 면 layer 알림 상 자 를 사 용 했 습 니 다.

window.onload = function(){
  if(window.parent != window){
    window.parent.location.href=window.location.href;
  } else {
    if(GetQueryString('logoutway')) {
      //alert('           ,    ');
      layer.alert('           ,      ,                  ', {
         skin: 'layui-layer-lan', //    
         title: '  '
         ,closeBtn: 0
        }, function(){
          var url = window.location.href;
          window.location.href = url.substr(0,url.indexOf('?logoutway=edge'));
        });
   }
  }
}

function GetQueryString(name)
{
   var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)");
   var r = window.location.search.substr(1).match(reg);
   if(r!=null)return unescape(r[2]); return null;
}

이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기