程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> java中應用session監聽完成同帳號登錄限制、登錄人數限制

java中應用session監聽完成同帳號登錄限制、登錄人數限制

編輯:關於JAVA

java中應用session監聽完成同帳號登錄限制、登錄人數限制。本站提示廣大學習愛好者:(java中應用session監聽完成同帳號登錄限制、登錄人數限制)文章只能為提供參考,不一定能成為您想要的結果。以下是java中應用session監聽完成同帳號登錄限制、登錄人數限制正文


本文重要引見了java中應用session監聽完成同帳號登錄限制、登錄人數限制,詳細代碼以下:

成績域:

1、同帳號登錄:若此帳號已登錄,弗成再次登錄(與QQ形式相反)。

2、登錄人數限制,跨越、已達人數限制則提醒:體系忙碌,稍後再試。

處理思緒:應用HttpSessionAttributeListener監聽器(固然我同時應用了HttpSessionListener不外感到欠好操作)

常識貯備:HttpSessionAttributeListener中有attributeAdd、attributeRemove、attributeWordStr3個辦法。

對session的setAttribute、removeAttribute將觸發attributeAdd、attributeRemove辦法,對統一個session的統一個attribute停止反復設置將觸發attributeWordStr辦法。

HttpSessionListener欠好操作的緣由:只需拜訪jsp頁面便會創立session(拜訪html其實不會創立session,在server端,如servlet中挪用HttpServletRequest.getSession(true)才會創立),jsp是靜態頁,實質就是個servlet。我的login.jsp明顯是個jsp,當我在監聽器中invalidate一個session,前往登錄頁,立時就又創立了一個session。這是我感到不清晰的處所,工夫沒抵家。

詳細完成:

監聽器代碼

public class OnlineListener implements HttpSessionListener,
    HttpSessionAttributeListener {
  private static List<SessionAndUser> sessions;
  static int delS = -1;
  static boolean flag = false;
  static {
    if (sessions == null) {
      sessions = Collections
          .synchronizedList(new ArrayList<SessionAndUser>());
    }
  }
  public void sessionCreated(HttpSessionEvent hse) {
    System.out.println(hse.getSession() + "-" + new Date());
    System.out.println(hse.getSession() + "-" + new Date());
  }
  public void sessionDestroyed(HttpSessionEvent hse) {
    System.out.println("-------------sessionDestroyed()-----------");
    System.out.println(hse.getSession() + " "
        + new Date(hse.getSession().getLastAccessedTime()));
    System.out.println(hse.getSession() + " " + new Date());
  }
  public void attributeAdded(HttpSessionBindingEvent e) {
    System.out.println("-------------*start added*-----------------------"
        + sessions.size());
    HttpSession session = e.getSession();
    ActionContext ctx = ActionContext.getContext();
    boolean newOne = true;
    String attrName = e.getName();
    // 登錄
    if (attrName.equals(Constant.USER_NAME)) {
      // 檢討登錄人數
      if (sessions.size() >= Constant.USER_LIMIT) {
        newOne = false;
        ctx.put("timeoutMSG", "serverBusy");
      }
      String nowUser = (String) e.getValue();
      // 遍歷一切session,檢討能否曾經登錄,若是則提醒曾經登錄
      for (int i = sessions.size() - 1; i >= 0; i--) {
        SessionAndUser tem = sessions.get(i);
        if (tem.getUserName().equals(nowUser)) {
          newOne = false;
          ctx.put("timeoutMSG", "beenLoged");// tem.getSession().invalidate();//
                            // 同賬號頂替登錄,主動挪用remove
          break;
        }
      }
      // 新登錄帳號添加進賬戶保護列表
      if (newOne) {
        SessionAndUser sau = new SessionAndUser();
        sau.setUserName(nowUser);
        sau.setSession(session);
        sau.setSid(session.getId());
        sessions.add(sau);
      }
    }
  }
  public void attributeRemoved(HttpSessionBindingEvent e)
      throws IllegalStateException {
    HttpSession session = e.getSession();
    System.out
        .println("-------------*start Removed*-----------------------"
            + sessions.size());
    if (delS > -1) {
      if (flag) {
        sessions.remove(delS);
        flag = false;
      }
    } else {
      // 登錄
      String attrName = e.getName();
      if (attrName.equals(Constant.USER_NAME)) {
        String nowUser = (String) e.getValue();
        // 遍歷一切session
        for (int i = sessions.size() - 1; i >= 0; i--) {
          SessionAndUser tem = sessions.get(i);
          if (tem.getUserName().equals(nowUser)) {
            sessions.remove(i);
            break;
          }
        }
      }
    }
  }
  public void attributeWordStrd(HttpSessionBindingEvent e) {
    HttpSession session = e.getSession();
    System.out
        .println("-------------*start replace*-----------------------"
            + sessions.size());
    String attrName = e.getName();
    delS = -1;
    // 登錄
    if (attrName.equals(Constant.USER_NAME)) {
      // User nowUser = (User) e.getValue();//old value
      String nowUser = (String) session.getAttribute(Constant.USER_NAME);// 以後session中的user
      // 遍歷一切session
      for (int i = sessions.size() - 1; i >= 0; i--) {
        SessionAndUser tem = sessions.get(i);
        if (tem.getUserName().equals(nowUser)
            && !tem.getSid().equals(session.getId())) {
          System.out.println("Remove:invalidate 1!");
          delS = i;
          flag = true;
        } else if (tem.getSid().equals(session.getId())) {
          tem.setUserName(nowUser);
        }
      }
      if (delS != -1) {
        sessions.get(delS).getSession().invalidate();// 掉效時主動挪用了remove辦法。也就會把它從sessions中移除
      }
    }
  }
}

代碼重要思緒是界說一個靜態List<SessionAndUser>寄存session和帳號稱號。

登錄的Action中取得監聽器前往值並處置的代碼

session.setAttribute(Constant.USER_NAME, operator.getUsername());
    ActionContext ctx = ActionContext.getContext();
    if("serverBusy".equals(ctx.get("timeoutMSG"))){
      ctx.put("timeoutMSG", "辦事器忙碌,請稍後再試");
      return "jump";
    }
    if("beenLoged".equals(ctx.get("timeoutMSG"))){
      ctx.put("timeoutMSG", "此賬戶在別處登錄");
      return "jump";
    }

頁面捕捉提醒信息代碼

<%@taglib prefix="s" uri="/struts-tags"%>
<s:property value="#attr.timeoutMSG" />

感激浏覽,願望能贊助到年夜家,感謝年夜家對本站的支撐!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved