1つの場所でのみログインできるJavawebの実装アイデア(QQログイン関数と同様)は次のとおりです。
1.この関数の機能は何ですか?
誰もがそれについて考えます。とにかく、常にそのような需要があります。最近は需要がありません。 。 hehe。時には要件ではない場合があり、安全のためにもそうする可能性が非常に高いです。たとえば、これを行うには、試験システムとオンラインチャットシステムが必要です。
2。実装プロセス
a。問題分析
システムでは、通常、ログイン情報をセッションにバインドします。これから始まることは解決策を見つけることができるようです。率直に言うと、ユーザーがログインしたときに、ユーザーがログインしているかどうかを判断します。ログインした場合は、前のセッションをクリアしても問題ありません。 。とても簡単に思えますよね?実際、慎重に考えると、次の問題が見つかります。ユーザーが以前にログインした方法、つまり、すべてのログインしたセッション情報にアクセスする方法はありますか?
b。特定の実装
誰もが知っているように、J2EE APIですべてのセッション情報を直接取得する具体的な方法はないようです。ただし、リスナーを構成することにより、すべてのセッションの作成プロセスと破壊プロセスを監視し、セッション内の属性の作成、削除、交換プロセスを監視できます。
実際、次のことを行う必要があります。
ユーザーログイン情報をセッションに保存するとき、対応するセッションは、現在のセッションを配列に記録できる属性を作成する属性プロセスです。
実際、リストに保存する場合、最初にユーザーのログイン情報があるかどうかをこのリストに既に存在するかどうかを通過する必要があります。存在する場合は、このリストに存在するセッション情報を破壊し、リストから削除します。存在しない場合は、セッション情報をリストに入れます。
セッションのログイン情報が破壊されたら、リストからセッションを直接削除します。
また、ユーザーがログアウトせずにログインして直接ログインする場合、これはセッション属性を置き換えるプロセスです。また、現在のセッション以外に、新しいユーザーが他のセッションに既に存在するかどうかを判断する必要があります。存在する場合は、削除します。
特定のコードは次のとおりです。
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 recordessessionListenerは、httpssessionAttributeListener、httpssessionlistener、httpssessionlistener {private static list <sessionanduser> == null){sessions = collections.synchronizedList(new ArrayList <SessionAnduser>());}} public void aTtributeAdded(httpsessionbindingEvent e){httpsession session = e.getSession(); system.out.Out.println( "--------------------------------"; if(attrname.equals(loginflag)){user nowuser =(user)e.getvalue(); user suser =(user)session.getTribute(loginflag); // sessionfor(int i = sessions.size() - 1; i> = 0; i--){sessionanduser tem = sessions.get.get(i); (tem.getuserid()。equals(nowuser.getname())){tem.getSession()。invalidate(); // removebreak;}} sessionanduser sau = new sessionanduser(); sau.setuserid(nowuser.getname()); sau.setsession(session); sau.setsid(session.getid()); sessions.add(sau);}} public void属性属性(httpsssionsbindeventevent e){httpsession session = e.getSession(); system.out.println( "-------------*削除を開始*----------------------"); string attrname = e.getName(); // i> = 0; i--){sessionanduser tem = sessions.get(i); if(tem.getuserid()。equals(nowuser.getname())){sessions.remove(i); break;}}}} e.getSession(); system.out.println( "----------------------------------------------------------------------------"); string attrname = e.getName(); int dels = -1; // (user)session.getattribute(loginflag); //現在のセッションのユーザー//すべてのsessionfor(int i = sessions.size() - 1; i> = 0; i-){sessionanduser tem = sessions.get(i); if if if (tem.getuserid()。equals(nowuser.getname())&&!tem.getSid()。equals(session.getid())){system.out.println( "remove:removalidate 1!"); dels = i;} else if(tem.getsid()。equals(session.getid())){tem.setuserid(nowuser.getname());}} if(dels!= -1){sessions.get(dels).getsession()。また、セッションから削除されます}}} public void sessioned(httpssessionevent e){} public void sessiondestroyed(httpssessionevent e){}}web.xmlの定式化
<リスナー> <ディスプレイ名>レコーセッション</display-name> <リスナークラス> com.weirhp.recordsessionlistener </ristener-class> </ristener>
3。可能な問題
プログラム全体が期待していなかったことがいくつかあるかもしれません。いくつかのバグがあるかもしれませんし、特定のプロジェクトで使用する場合は慎重になる必要があります。誰もが写真を撮って、いくつかの提案をすることを望んでいます。もう一度改善します。
4.後でいくつかの考え
両方のマシンが同じアカウントを使用して同時にシステムにログインする場合、両方のアカウントを正常にログインすることができますか? 。 (また、このセッションリストが非常に大きい場合、トラバーサル期間中に同じアカウントを使用してシステムにログインするときに2つのマシンが正常にログインすることができます)。非常に絡み合っています。 。どのように制御する必要がありますか?
(解決策:テスト後、リスナーはシステム内のシングルトンです。そのメソッドに同期キーワードを追加すると、リストのスレッドの安全性が確保されます。)
上記は、エディターが同時に1つの場所でのみログインできることを紹介したJavawebです(QQログイン関数と同様)。私はそれが誰にでも役立つことを願っています。ご質問がある場合は、メッセージを残してください。編集者は、すべての人に時間内に返信します。 wulin.comのウェブサイトへのご支援ありがとうございます!