一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術|

服務器之家 - 編程語言 - JAVA教程 - JavaWeb實現同一帳號同一時間只能一個地點登陸(類似QQ登錄的功能)

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

2020-07-01 11:43l284849736 JAVA教程

最近做了企業項目,其中有這樣的需求要求同一帳號同一時間只能一個地點登陸類似QQ登錄的功能。下面小編通過本文給大家分享實現思路,感興趣的朋友參考下吧

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

一、該功能有什么作用

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

二、實現過程

a.問題分析

    在系統中,我們一般都是把登錄信息綁定到session中,看來從這入手是可能找到解決辦法。說白了,也就是當用戶登錄時,判斷一下這個用戶有沒有登錄,如果登錄了,就把以前的那個session清除掉就OK了。。看似很簡單是不?其實你細想你會發現有以下問題:如何得到之前這個用戶有沒有登錄過,也就是如何訪問到所有登錄的session信息呢?

b.具體實現

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

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

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

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

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

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

具體代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
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();//自動調用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();//失效時自動調用了remove方法。也就會把它從sessions中移除了
}
}
}
public void sessionCreated(HttpSessionEvent e) {
}
public void sessionDestroyed(HttpSessionEvent e) {
}
}

在web.xml中的配制

?
1
2
3
4
<listener>
<display-name>recordSession</display-name>
<listener-class>com.weirhp.RecordSessionListener</listener-class>
</listener>

三、可能存在的問題

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

四、后來的一些思考

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

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

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

原文鏈接:http://blog.csdn.net/l284849736/article/details/26213349

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 色在线亚洲视频www 色欲麻豆国产福利精品 | h肉动漫在线视频无修无遮挡 | 特黄特黄一级高清免费大片 | 草莓视频首页 | 日本sss在线高清观看 | 四虎影在线永久免费观看 | 国产伦码精品一区二区 | 欧美2区 | 日本色女 | 调教女帝| 果冻传媒ⅹxxxxxhd | 国产亚洲精品高清在线 | 欧美精品一线二线大片 | 91aaa免费免费国产在线观看 | 99久久免费国产香蕉麻豆 | 1377大但人文艺术包子铺 | 欧美一二区 | 亚洲激情成人 | 国产欧美又粗又猛又爽老 | 91桃色视频在线观看 | 99精彩视频在线观看 | 男女真实无遮挡xx00动态图软件 | 韩国三级在线高速影院 | 久久精麻豆亚洲AV国产品 | 亚洲干综合 | 黑人巨大精品战中国美女 | 精品国产乱码久久久人妻 | 娇妻在床上迎合男人 | 久久综合狠狠综合狠狠 | 美人老师沦为 | 日韩精品视频在线播放 | 精品国产一区二区三区国产馆 | 国产欧美va欧美va香蕉在线观看 | 视频在线观看高清免费看 | 欧美在线观看一区二区三 | 青青99| 很很草 | 五月丁香啪啪. | 91久久夜色精品国产九色 | 亚洲乱码一二三四五六区 | 丝瓜黄瓜茄子西红柿秋葵榴莲 |