ユーザーの再ログイン防止ソリューション
8410 ワード
前の時間は1つの需要に出会った:1つのアカウントは1回しかログインできず、繰り返しログインできない問題.
ネットで探してみると、2つの解決策があります.
1.データベースステータスビットにより当該ユーザがログインしたか否かを判定する.
2、セッションリスナーを利用して各ログインユーザーのログイン状況を傍受する.
個人的に考えてみると、最初のソリューションは簡単ですが、ブラウザを直接閉じるなど、ユーザーが正常に終了していない場合を考慮する必要があり、可用性が低いです.
次に、第2のシナリオの具体的な実装について説明します.
A.ユーザーがログインした後、まずデータベースに行って、そのログイン名が存在するかどうか、ロックされているかどうかを調べ、ログイン名が存在し、ロックされていない場合、アプリケーション内蔵の役割ドメインオブジェクトからすべてのログイン情報を取り出し、そのログイン名がログインされているかどうかを確認し、ログインしたら、友好的なヒントを与える.逆にログイン可能であることを示し、そのログイン情報をアプリケーションに保存します.
B.ログインを考えた上で、終了を考えます.ユーザが正常に終了した場合、そのユーザのログイン情報をセッションから削除する必要があります.セッションリスナーを書いて、セッションの破棄を傍受するときに、ログインしたユーザーをキャンセルします.つまり、アプリケーションから削除します.ユーザーがオフラインになったことを示します.主なコードは次のとおりです.
また、ログインしたユーザーが突然ブラウザを閉じて終了ボタンをクリックしなかったという問題もあります.ではbeforeunloadイベントを利用して、ブラウザがリフレッシュまたは閉じるときにトリガーすることができます.
ネットで探してみると、2つの解決策があります.
1.データベースステータスビットにより当該ユーザがログインしたか否かを判定する.
2、セッションリスナーを利用して各ログインユーザーのログイン状況を傍受する.
個人的に考えてみると、最初のソリューションは簡単ですが、ブラウザを直接閉じるなど、ユーザーが正常に終了していない場合を考慮する必要があり、可用性が低いです.
次に、第2のシナリオの具体的な実装について説明します.
A.ユーザーがログインした後、まずデータベースに行って、そのログイン名が存在するかどうか、ロックされているかどうかを調べ、ログイン名が存在し、ロックされていない場合、アプリケーション内蔵の役割ドメインオブジェクトからすべてのログイン情報を取り出し、そのログイン名がログインされているかどうかを確認し、ログインしたら、友好的なヒントを与える.逆にログイン可能であることを示し、そのログイン情報をアプリケーションに保存します.
02
//
03
Map loginUserMap = (Map)
super
.getApplicationAttr(Constant.LOGIN_USER_MAP);
04
boolean
isExist =
false
;
05
String sessionId =
super
.getSessionId(
false
);
06
07
if
(loginUserMap==
null
){
08
loginUserMap =
new
HashMap();
09
}
10
11
for
(String username : loginUserMap.keySet()) {
12
// ,
13
if
(!username.equals(user.getFuUserName()) || loginUserMap.containsValue(sessionId)){
14
continue
;
15
}
16
isExist =
true
;
17
break
;
18
}
19
20
if
(isExist){
21
//
22
//
23
}
else
{
24
//
25
loginUserMap.put(result.getFuUserName(), sessionId);
26
//
27
}
28
//
B.ログインを考えた上で、終了を考えます.ユーザが正常に終了した場合、そのユーザのログイン情報をセッションから削除する必要があります.セッションリスナーを書いて、セッションの破棄を傍受するときに、ログインしたユーザーをキャンセルします.つまり、アプリケーションから削除します.ユーザーがオフラインになったことを示します.主なコードは次のとおりです.
//
02
public
void
sessionDestroyed(HttpSessionEvent event) {
03
//
04
// session loginUserMap
05
User user = (User)event.getSession().getAttribute(
"loginUser"
);
06
if
(user!=
null
){
07
Map loginUserMap = (Map)event.getSession().getServletContext().getAttribute(
"loginUserMap"
);
08
loginUserMap.remove(user.getFuUserName());
09
event.getSession().getServletContext().setAttribute(
"loginUserMap"
,loginUserMap);
10
}
11
//
12
}
13
//
また、ログインしたユーザーが突然ブラウザを閉じて終了ボタンをクリックしなかったという問題もあります.ではbeforeunloadイベントを利用して、ブラウザがリフレッシュまたは閉じるときにトリガーすることができます.