Gagasan implementasi Javaweb yang hanya dapat masuk di satu tempat pada saat yang sama (mirip dengan fungsi login QQ) adalah sebagai berikut:
1. Apa fungsi fungsi ini?
Semua orang memikirkannya. Bagaimanapun, akan selalu ada permintaan seperti itu. Tidak akan ada permintaan hari ini. . hehe. Terkadang itu mungkin bukan persyaratan, dan sangat mungkin juga akan dilakukan untuk keselamatan. Misalnya, sistem pemeriksaan dan sistem obrolan online diperlukan untuk melakukan ini.
2. Proses Implementasi
A. Analisis masalah
Dalam sistem, kami biasanya mengikat informasi login ke sesi. Tampaknya mulai dari ini dimungkinkan untuk menemukan solusi. Terus terang, ketika pengguna masuk, tentukan apakah pengguna masuk. Jika dia masuk, akan baik -baik saja untuk menghapus sesi sebelumnya. . Tampaknya sangat sederhana, bukan? Bahkan, jika Anda memikirkannya dengan cermat, Anda akan menemukan masalah berikut: Bagaimana cara membuat pengguna telah masuk sebelumnya, yaitu, bagaimana mengakses semua informasi sesi yang masuk?
B. Implementasi spesifik
Seperti yang kita semua tahu, tampaknya tidak ada metode khusus untuk secara langsung mendapatkan semua informasi sesi di J2EE API. Tetapi kita dapat memantau semua proses pembuatan dan penghancuran sesi dengan mengonfigurasi pendengar, serta memantau proses penciptaan, penghapusan dan penggantian atribut dalam sesi.
Bahkan, kita hanya perlu melakukan hal berikut:
Saat menyimpan informasi login pengguna ke sesi, sesi yang sesuai adalah proses yang dikaitkan dengan membuat atribut, yang dapat merekam sesi saat ini ke dalam daftar array.
Bahkan, saat menyimpannya ke daftar, Anda harus terlebih dahulu melintasi apakah ada informasi login dari pengguna sudah ada dalam daftar ini. Jika ada, hancurkan informasi sesi yang ada dalam daftar ini dan hapus dari daftar. Jika tidak ada, masukkan informasi sesi ke dalam daftar.
Ketika informasi login sesi dihancurkan, hapus sesi dari daftar secara langsung.
Juga, ketika pengguna masuk tanpa keluar dan mencatat secara langsung, ini adalah proses mengganti atribut sesi. Juga perlu untuk menentukan apakah pengguna baru sudah ada di sesi lain selain sesi saat ini. Jika ada, hapus.
Kode spesifiknya adalah sebagai berikut:
Paket com.weirhp; impor java.util.arraylist; import java.util.collections; impor java.util.list; impor javax.servlet.http.httpsession; impor javax.servlet.http.httpsessionTattributener; impor javax.servlet javax.servlet.http.httpsessionEvent; import javax.servlet.http.httpsessionlistener; Class Public RecordSessionListener mengimplementasikan httpsessionAttributeListener, httpsessionListener {daftar statis private <Sesi Sesi dan Sesi> Sesi; Sesi Publik; null) {sessions = collections.synchronizedList (arraylist baru <sessionAndUser> ());}} public void atributeadded (httpsessionBindingEvent e) {httpsession sesion = e.getSession (); System.out.println ("---------------------*---------------------- ;--------- ;-----登录 if (attrname.equals (loginflag)) {user nowuser = (user) e.getValue (); pengguna suser = (user) session.getAttribute (loginflag); // 遍历所有 sessionfor (int i = sesions.size ()-1; i> = 0; i--) {sessionSanduser tem = Sessions. (tem.getUserId (). Equals (nowUser.getName ())) {tem.getSession (). Invalidate (); // Secara otomatis hubungi RemoveBreak;}} sessionAnduser Sau = baru 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 ("-------------*Mulai Dihapus*-----------------------"); string attrname = e.getname (); // 登录 if (attrname.equals (loginflag)) {pengguna nowUser = (pengguna) e.getValue (); // 遍历所有 遍历所有 {USER NowUser = () e.getValue ();// 遍历所有 遍历所有 sessionFor (int i = s = () E.getValue ();// 遍历所有 遍历所有 sessionFor (int i = s = () E.getValue ();// 遍历所有 遍历所有 sessionFor (int i = s = () e.getValue ();// 遍历所有 sessionFor (int i = s = () e.getValue ();/ 遍历所有 遍历所有 遍历所有 {int i = () E.getValue. i> = 0; i--) {sessionAndUser tem = session.get (i); if (tem.getUserId (). Equals (nowUser.getName ())) {sessions.remove (i); break;}}} public void attributeReplaced (httpsessionBindingEvent e) {htttpspession = htpespession = httpsessionBinding e) {htttpspession e.getSession (); System.out.println ("-------------*Mulai Ganti*-----------------------"); string attrname = e.getname (); int del = -1; // 登录 if (attrname.equals (LoginFlag)) {// pengguna nowUser = (user) e.getValue (); (User) session.getAttribute (loginFlag); // pengguna dalam sesi saat ini // melintasi semua sesi untuk (int i = session.size ()-1; i> = 0; i--) {sessionAnduser tem = getname.get (i); if (tem.getUserid (). {System.out.println ("Hapus: Invalidate 1!"); Dels = i;} lain if (tem.getSid (). Equals (session.getId ())) {tem.setUserId (nowUser.getName ();}} if (dels! =-1) {Sesions.gety (dels); tidak valid. Ini juga akan dihapus dari sesi}}} public void sessioncreated (httpsessionEvent e) {} public void sessionDestroyed (httpsessionEvent e) {}}Formulasi dalam Web.xml
<listener> <play-name> Recordsession </display-name> <Distener-Class> com.weirhp.recordSessionListener </listener-class> </listener>
3. Masalah yang mungkin terjadi
Mungkin ada beberapa hal yang tidak diharapkan oleh seluruh program. Mungkin ada beberapa bug, dan Anda harus berhati -hati saat digunakan dalam proyek tertentu. Semua orang dipersilakan untuk membuat gambar dan berharap untuk memberikan beberapa saran. Saya akan memperbaikinya lagi.
4. Beberapa pemikiran nanti
Jika kedua mesin menggunakan akun yang sama untuk masuk ke sistem pada saat yang sama, dapatkah kedua akun dapat masuk dengan sukses? . (Juga, ketika daftar sesi ini sangat besar, dua mesin dapat masuk dengan sukses saat masuk ke sistem menggunakan akun yang sama pada saat yang sama selama periode traversal). Sangat terjerat. . Bagaimana seharusnya dikendalikan?
(Solusi: Setelah pengujian, pendengar adalah singleton dalam sistem. Menambahkan kata kunci sinkronisasi ke metodenya dapat memastikan keamanan utas daftar.)
Di atas adalah Javaweb yang diperkenalkan kepada Anda bahwa editor hanya dapat masuk di satu tempat pada saat yang sama (mirip dengan fungsi login QQ). Saya harap ini akan membantu semua orang. Jika Anda memiliki pertanyaan, silakan tinggalkan saya pesan dan editor akan membalas semua orang tepat waktu. Terima kasih banyak atas dukungan Anda ke situs web Wulin.com!