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

JavaWeb實現(xiàn)同一帳號同一時間只能一個地點登陸(類似QQ登錄的功能)

 更新時間:2016年11月07日 10:54:53   作者:l284849736  
最近做了企業(yè)項目,其中有這樣的需求要求同一帳號同一時間只能一個地點登陸類似QQ登錄的功能。下面小編通過本文給大家分享實現(xiàn)思路,感興趣的朋友參考下吧

JavaWeb實現(xiàn)同一帳號同一時間只能一個地點登陸(類似QQ登錄的功能)的實現(xiàn)思路如下所示:

一、該功能有什么作用

大家想想吧。反正總會有這樣的需求的。這年頭什么需求不會有。。呵呵。有時候也不一定是需求,很有可能為了安全也會這么做。例如考試系統(tǒng),在線聊天系統(tǒng),很有必要做成這樣的吧。

二、實現(xiàn)過程

a.問題分析

    在系統(tǒng)中,我們一般都是把登錄信息綁定到session中,看來從這入手是可能找到解決辦法。說白了,也就是當用戶登錄時,判斷一下這個用戶有沒有登錄,如果登錄了,就把以前的那個session清除掉就OK了。??此坪芎唵问遣唬科鋵嵞慵毾肽銜l(fā)現(xiàn)有以下問題:如何得到之前這個用戶有沒有登錄過,也就是如何訪問到所有登錄的session信息呢?

b.具體實現(xiàn)

   大家知道,在j2ee api好像是沒有具體的方法直接得到所有session信息的。但是我們可以通過配制監(jiān)聽器,監(jiān)控所有的session創(chuàng)建和消毀過程,以及可以監(jiān)控session中的屬性的創(chuàng)建,刪除和替換過程。

其實我們只要做以下處理即可:

在保存用戶登錄信息到session時,對應(yīng)的也就是session一個屬性的創(chuàng)建過程(attributeAdded),可以把當前這個session記錄到一個ArrayList中。

其實在保存到list中時你要首先遍歷一下這個list中有沒有已經(jīng)存在該用戶的登錄信息。如果存在就消毀掉這個list中存在的session信息,并且從list中移除,不存在就把該session信息放到list中。

在session的登錄信息消毀時,直接把該sesseion從list中移除掉。

還有就是當用戶登錄后沒有退出直接登錄這個時候是一個session屬性的替換過程。也要做處理判斷新的用戶是否已經(jīng)在除了當前session的其它session中是否存在。存在則刪除。

具體代碼如下:

package com.weirhp;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class RecordSessionListener implements HttpSessionAttributeListener,
HttpSessionListener {
private static List<SessionAndUser> sessions;
public static String loginFlag = "loginUser";
static {
if (sessions == null) {
sessions = Collections.synchronizedList(new ArrayList<SessionAndUser>());
}
}
public void attributeAdded(HttpSessionBindingEvent e) {
HttpSession session = e.getSession();
System.out.println("-------------*start added*-----------------------");
String attrName = e.getName();
// 登錄
if (attrName.equals(loginFlag)) {
User nowUser = (User) e.getValue();
User sUser = (User)session.getAttribute(loginFlag);
// 遍歷所有session
for (int i = sessions.size()-1; i >= 0; i--) {
SessionAndUser tem = sessions.get(i);
if (tem.getUserID().equals(nowUser.getName())) {
tem.getSession().invalidate();//自動調(diào)用remove
break;
}
}
SessionAndUser sau = new SessionAndUser();
sau.setUserID(nowUser.getName());
sau.setSession(session);
sau.setSid(session.getId());
sessions.add(sau);
}
}
public void attributeRemoved(HttpSessionBindingEvent e) {
HttpSession session = e.getSession();
System.out.println("-------------*start Removed*-----------------------");
String attrName = e.getName();
// 登錄
if (attrName.equals(loginFlag)) {
User nowUser = (User) e.getValue();
// 遍歷所有session
for (int i = sessions.size()-1; i >= 0; i--) {
SessionAndUser tem = sessions.get(i);
if (tem.getUserID().equals(nowUser.getName())) {
sessions.remove(i);
break;
}
}
}
}
public void attributeReplaced(HttpSessionBindingEvent e) {
HttpSession session = e.getSession();
System.out.println("-------------*start replace*-----------------------");
String attrName = e.getName();
int delS=-1;
// 登錄
if (attrName.equals(loginFlag)) {
// User nowUser = (User) e.getValue();//old value
User nowUser = (User)session.getAttribute(loginFlag);//當前session中的user
// 遍歷所有session
for (int i = sessions.size()-1; i >= 0; i--) {
SessionAndUser tem = sessions.get(i);
if (tem.getUserID().equals(nowUser.getName())&&!tem.getSid().equals(session.getId())) {
System.out.println("Remove:invalidate 1!");
delS=i;
}else if(tem.getSid().equals(session.getId())){
tem.setUserID(nowUser.getName());
}
}
if (delS!=-1) {
sessions.get(delS).getSession().invalidate();//失效時自動調(diào)用了remove方法。也就會把它從sessions中移除了
}
}
}
public void sessionCreated(HttpSessionEvent e) {
}
public void sessionDestroyed(HttpSessionEvent e) {
}
}

在web.xml中的配制

<listener>
<display-name>recordSession</display-name>
<listener-class>com.weirhp.RecordSessionListener</listener-class>
</listener>

三、可能存在的問題

整個個程序可能有的點沒有想到??赡艽嬖谝恍゜ug,用于具體項目需謹慎,歡迎大家拍磚,也希望給點建議。我再改進。

四、后來的一些思考

  如果兩臺機器使用同一帳號在同一時刻登錄系統(tǒng),是不是兩個帳號都可以登錄成功呢。。(還有就是這個session List很大時,在遍歷的時間段中兩臺機器使用同一帳號在同一時刻登錄系統(tǒng)也可能會成功登錄的)。很是糾結(jié)。。應(yīng)該怎么控制呢?

(解決辦法:經(jīng)測試Listener在系統(tǒng)中是一個單例,在它的方法上加上synchronize關(guān)鍵字就可以保證list的線程安全了。)

以上所述是小編給大家介紹的JavaWeb實現(xiàn)同一帳號同一時間只能一個地點登陸(類似QQ登錄的功能),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Java String的intern方法使用場景示例

    Java String的intern方法使用場景示例

    這篇文章主要介紹了Java String的intern方法使用場景示例,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-11-11
  • java實現(xiàn)隨機抽取獎品工具類

    java實現(xiàn)隨機抽取獎品工具類

    這篇文章主要為大家詳細介紹了java實現(xiàn)隨機抽取獎品工具類,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • java搭建ftp/sftp進行數(shù)據(jù)傳遞的全過程

    java搭建ftp/sftp進行數(shù)據(jù)傳遞的全過程

    ftp是一種文件傳輸協(xié)議,讓客戶端和服務(wù)端能夠互相傳遞文件,圖片等數(shù)據(jù),sftp也是一種文件傳輸協(xié)議,但是相比較而言要比ftp安全性更好些,但是也有缺點就是傳輸效率低
    2021-07-07
  • idea創(chuàng)建spring boot項目及java版本只能選擇17和21的問題

    idea創(chuàng)建spring boot項目及java版本只能選擇17和21的問題

    這篇文章主要介紹了idea創(chuàng)建spring boot項目及java版本只能選擇17和21的問題,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2024-01-01
  • SpringBoot ApplicationEvent之事件發(fā)布與監(jiān)聽機制詳解

    SpringBoot ApplicationEvent之事件發(fā)布與監(jiān)聽機制詳解

    本文將深入探討SpringBoot的事件機制,介紹其核心概念、實現(xiàn)方法及最佳實踐,幫助開發(fā)者構(gòu)建更加靈活、可維護的應(yīng)用架構(gòu),希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • SpringBoot初始化加載配置的八種方式總結(jié)

    SpringBoot初始化加載配置的八種方式總結(jié)

    在日常開發(fā)時,我們常常需要 在SpringBoot應(yīng)用啟動時執(zhí)行某一段邏輯,如獲取一些當前環(huán)境的配置或變量、向數(shù)據(jù)庫寫入一些初始數(shù)據(jù)或者連接某些第三方系統(tǒng),確認對方可以工作,那么在實現(xiàn)初始化邏輯代碼時就需要小心了,所以本文介紹了SpringBoot初始化加載配置的方式
    2024-12-12
  • mybatis?實體類字段大小寫問題?字段獲取不到值的解決

    mybatis?實體類字段大小寫問題?字段獲取不到值的解決

    這篇文章主要介紹了mybatis?實體類字段大小寫問題?字段獲取不到值的解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 詳解Java Project項目打包成jar,并生成exe文件

    詳解Java Project項目打包成jar,并生成exe文件

    本篇文章主要介紹了Java Project項目打包成jar,并生成exe文件,非常具有實用價值,有興趣的可以了解一下。
    2017-01-01
  • Java中正則表達式匹配過程實例詳解

    Java中正則表達式匹配過程實例詳解

    正則匹配即是在給定字符串中查找符合正則表達式的字符,下面這篇文章主要給大家介紹了關(guān)于Java中正則表達式匹配過程的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-10-10
  • Mybatis如何自動生成數(shù)據(jù)庫表的實體類

    Mybatis如何自動生成數(shù)據(jù)庫表的實體類

    這篇文章主要介紹了Mybatis自動生成數(shù)據(jù)庫表的實體類的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06

最新評論

汽车| 桐庐县| 扎囊县| 唐河县| 扎赉特旗| 荆州市| 东莞市| 信阳市| 响水县| 宜宾市| 常州市| 石狮市| 泰州市| 慈溪市| 突泉县| 新泰市| 望江县| 南漳县| 海南省| 阿拉尔市| 青阳县| 眉山市| 舞阳县| 宝坻区| 五原县| 潞西市| 云林县| 蒙阴县| 南平市| 堆龙德庆县| 阳江市| 锡林浩特市| 花莲县| 平原县| 梁河县| 武邑县| 定南县| 延川县| 井冈山市| 论坛| 长治市|