最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java中使用session監(jiān)聽實現(xiàn)同帳號登錄限制、登錄人數限制

 更新時間:2016年10月20日 17:02:57   作者:ivyx  
本文主要介紹了java中使用session監(jiān)聽實現(xiàn)同帳號登錄限制、登錄人數限制,通過session來監(jiān)聽在線人數和登陸限制,有需要的童鞋可以了解一下。

本文主要介紹了java中使用session監(jiān)聽實現(xiàn)同帳號登錄限制、登錄人數限制,具體代碼如下:

問題域:

1、同帳號登錄:若此帳號已登錄,不可再次登錄(與QQ模式相反)。

2、登錄人數限制,超過、已達人數限制則提示:系統(tǒng)繁忙,稍后再試。

解決思路:使用HttpSessionAttributeListener監(jiān)聽器(雖然我同時使用了HttpSessionListener不過感覺不好操作)

知識儲備:HttpSessionAttributeListener中有attributeAdd、attributeRemove、attributeReplace3個方法。

對session的setAttribute、removeAttribute將觸發(fā)attributeAdd、attributeRemove方法,對同一個session的同一個attribute進行重復設置將觸發(fā)attributeReplace方法。

HttpSessionListener不好操作的原因:只要訪問jsp頁面便會創(chuàng)建session(訪問html并不會創(chuàng)建session,在server端,如servlet中調用HttpServletRequest.getSession(true)才會創(chuàng)建),jsp是動態(tài)頁,本質就是個servlet。我的login.jsp顯然是個jsp,當我在監(jiān)聽器中invalidate一個session,返回登錄頁,馬上就又創(chuàng)建了一個session。這是我感覺不清楚的地方,功夫沒到家。

具體實現(xiàn):

監(jiān)聽器代碼

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 attributeReplaced(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中移除了
      }
    }
  }
}

代碼主要思路是定義一個靜態(tài)List<SessionAndUser>存放session和帳號名稱。

登錄的Action中獲得監(jiān)聽器返回值并處理的代碼

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" />

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關文章

  • java實現(xiàn)批量導入.csv文件到mysql數據庫

    java實現(xiàn)批量導入.csv文件到mysql數據庫

    這篇文章主要為大家詳細介紹了java實現(xiàn)批量導入.csv文件到mysql數據庫,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • 實戰(zhàn)分布式醫(yī)療掛號通用模塊統(tǒng)一返回結果異常日志處理

    實戰(zhàn)分布式醫(yī)療掛號通用模塊統(tǒng)一返回結果異常日志處理

    這篇文章主要為大家介紹了實戰(zhàn)分布式醫(yī)療掛號系統(tǒng)之統(tǒng)一返回結果統(tǒng)一異常處理,統(tǒng)一日志處理到通用模塊示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-04-04
  • Java多態(tài)和實現(xiàn)接口的類的對象賦值給接口引用的方法(推薦)

    Java多態(tài)和實現(xiàn)接口的類的對象賦值給接口引用的方法(推薦)

    下面小編就為大家?guī)硪黄狫ava多態(tài)和實現(xiàn)接口的類的對象賦值給接口引用的方法(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • 解讀@Transactional失效的幾種情況

    解讀@Transactional失效的幾種情況

    這篇文章主要介紹了@Transactional失效的幾種情況,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • IDEA之翻譯器的使用Translation

    IDEA之翻譯器的使用Translation

    這篇文章主要介紹了IDEA之翻譯器的使用Translation,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • 基于Spring Batch向Elasticsearch批量導入數據示例

    基于Spring Batch向Elasticsearch批量導入數據示例

    本文介紹了基于Spring Batch向Elasticsearch批量導入數據示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-02-02
  • Java中的異步與線程池解讀

    Java中的異步與線程池解讀

    這篇文章主要介紹了Java中的異步與線程池,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • SpringBoot如何集成Netty

    SpringBoot如何集成Netty

    這篇文章主要介紹了SpringBoot如何集成Netty問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Java的引用類型常用的四種方法

    Java的引用類型常用的四種方法

    這篇文章主要介紹了Java的引用類型常用的幾種方法,Java為引用類型專門定義了一個類Reference,它是引用對象的抽象基類,相關內容需要的小伙伴可以參考一下
    2022-06-06
  • SpringBoot+Redis實現(xiàn)接口防刷的示例代碼

    SpringBoot+Redis實現(xiàn)接口防刷的示例代碼

    在實際開發(fā)中,會出現(xiàn)用戶多次點擊發(fā)送請求,本文主要介紹了SpringBoot+Redis實現(xiàn)接口防刷的示例代碼,具有一定的參考價值,感興趣的可以了解一下
    2024-01-01

最新評論

宝鸡市| 城固县| 贺州市| 江孜县| 晋州市| 云梦县| 石台县| 平乡县| 且末县| 六安市| 米脂县| 额尔古纳市| 滦南县| 华池县| 广宗县| 济宁市| 南华县| 威信县| 新巴尔虎右旗| 察哈| 洪湖市| 昔阳县| 基隆市| 宜黄县| 金秀| 陵水| 甘泉县| 玉林市| 苍山县| 安丘市| 竹北市| 广东省| 邯郸市| 都江堰市| 建昌县| 五原县| 高邮市| 阿鲁科尔沁旗| 鹤岗市| 彰化县| 开鲁县|