Dalam proyek Web saat ini, banyak situasi adalah bahwa informasi akun yang sama dapat masuk pada portal login yang berbeda kali ini, sehingga tidak akan begitu indah.
Bacaan yang Disarankan:
Implementasi Pembatasan Login Multi-Pengguna Java
Sekarang ada dua solusi:
1. Simpan informasi login pengguna dengan bidang dalam bendera. Setiap kali login berhasil, ditandai 1, dan login ditandai 0. Ketika ditandai 1, tidak diperbolehkan masuk.
2. Simpan informasi login pengguna dalam lingkup bawaan aplikasi, dan kemudian gunakan pendengar sesi untuk memantau status login dari setiap pengguna yang masuk.
Jelas, metode pertama membutuhkan pengoperasian database setiap kali Anda masuk, yang menambahkan beberapa overhead kinerja yang tidak perlu. Selain itu, jika komputer tiba -tiba dimatikan selama keadaan login, Anda tidak akan pernah bisa masuk, dan kegunaannya relatif rendah.
Tetapi metode kedua berbeda, sangat dapat dioperasikan dan nyaman untuk mempertahankan informasi semua pengguna online.
Selanjutnya, kami terutama akan memperkenalkan implementasi spesifik dari metode kedua:
1. Dalam metode login untuk memproses login, permintaan pertama database untuk memverifikasi apakah pengguna ada. Jika ada, tentukan apakah akun login telah dikunci. Kemudian ambil semua informasi login dari objek lingkup bawaan aplikasi untuk memeriksa apakah akun nama pengguna telah masuk. Jika masuk, itu akan menjadi prompt yang ramah. Jika tidak, itu berarti Anda dapat masuk dan menyimpan informasi login dalam aplikasi dalam bentuk pasangan nilai kunci.
Kodenya adalah sebagai berikut:
// Tindakan harus ditambahkan ke setiap metode akses sebelum konfigurasi nol, sebaliknya 404 @Action (value = "login", hasil = {@result (name = "index", location = "index.jsp"),}) string publik login () melempar pengecualian {coba {user hasil = Userservice.login (user.getfuuseName () (), User. if (result! = null) {if (result.getFustatus ()! = null && result.getFustatus () == 0) {super.setRequestAttr (constant.message, "Maaf, pengguna ini telah dikunci!"); mengembalikan "kesalahan"; } Peta <string, string> loginusermap = (peta <string, string>) super.getAppLicationAttr (constant.login_user_map); boolean isexist = false; String sessionId = super.getSessionId (false); if (loginusermap == null) {loginusermap = hashmap baru <string, string> (); } untuk (string username: loginusermap.keyset ()) {// menilai apakah informasi pengguna yang masuk telah disimpan atau jika pengguna yang sama telah berulang kali masuk, kemudian login diizinkan jika (! Username.Equals (hasil.getFuusername ()) || loginusermap. } isExist = true; merusak; } if (isExist) {super.setRequestAttr (constant.message, "Maaf, pengguna masuk!"); mengembalikan "kesalahan"; } else {LoginUsermap.put (result.getFuusername (), sessionId); } // Login berhasil super.setsessionAttr (constant.login_user, hasil); super.setApplicationAttr (constant.login_user_map, loginusermap); logger.info (result.getFuusername () + "Login berhasil!"); // Jika fromUrl memiliki nilai di sesi, lompat ke string halaman fromUrl = (string) super.getSessionAttr (constant.from_url); if (fromUrl! = null) {super.setsessionattr (constant.from_url, null); super.getResponse (). sendredirect (fromurl.toString ()); kembali nol; } return "index"; }} catch (Exception e) {e.printstacktrace (); logger.info ("Login gagal:"+e.getMessage ()); } super.setRequestAttr ("pesan", "error"); mengembalikan "kesalahan"; }2. Setelah portal login diproses, mengingat bahwa sesi berakhir, pengguna login yang sesuai juga harus keluar dari login yang sesuai. Kita bisa menulis pendengar sesi. Ketika sesi dihancurkan, kami mencatat pengguna yang masuk, yaitu, menghapusnya dari aplikasi. Ini berarti bahwa pengguna telah offline.
Kodenya adalah sebagai berikut:
paket com.facelook.util; impor java.util.map; impor javax.servlet.http.httpsessionEvent; impor javax.servlet.http.httpsessionlistener; impor org.apache.log4j.logger; impor com.facelook.entity.user; Public Class SessionListener mengimplementasikan httpsessionListener {private logger logger = logger.getLogger (this.getClass ()); @Override public void sessioncreated (httpsessionEvent event) {} @Override public void sessionDestroyed (acara httpsessionEvent) {// hapus pasangan nilai kunci yang disimpan dalam loginusermap ketika sesi dihancurkan pengguna pengguna = (pengguna) event.getSession (). GetAntribute ("Loginuser User = ("); if (user! = null) {peta <string, string> loginusermap = (peta <string, string>) event.getSession (). getserVletContext (). getAttribute ("loginusermap"); loginusermap.remove (user.getFuusername ()); event.getSession (). getServletContext (). setAttribute ("LoginUserMap", LoginUserMap); }}}Konfigurasi di web.xml adalah sebagai berikut:
<!-Sesi pendengar-> <dresinger> <dengarerer-class> com.facelook.util.SessionListener </listener-class> </engeaner>
3. Selain itu, ada masalah lain. Jika pengguna yang masuk tiba -tiba menutup browser atau halaman tanpa mengklik tombol logout. Kemudian Anda dapat menggunakan acara sebelumnya untuk menembak saat browser menyegarkan atau ditutup.
// Events $ (window) .bind ('sebelumnya muat', function () {$ .Ajax ({url: "$ {ctx} /system/user/user!logout.action", ketik: "post", success: function () {waspada Anda telah keluar ");}});););Namun, jika beberapa alasan obyektif, seperti komputer tiba-tiba dimatikan, restart otomatis, dll., Ini tidak dapat dihindari, sehingga Anda hanya bisa menunggu sesi sesi sisi server disetel ulang sebelum Anda dapat masuk lagi.
Kecuali itu adalah modul yang menghitung semua personel online, administrator mengelola login dan status logout personel online, dan secara langsung menghancurkan mereka yang masuk ke pengguna dengan masalah.
Selanjutnya, mari kita perkenalkan secara singkat manajemen modul personel online:
1. Pertama, pendengar sesi diperlukan untuk memantau semua balasan membuat situasi. Pada saat ini, setiap kali sesi dibuat, Count+1 dapat dihitung, dan kemudian Count-1 dihancurkan. Selain itu, pendengar ServletContext diperlukan untuk memantau siklus hidup aplikasi web, mendapatkan objek ServletContext, dan kemudian menghitung jumlah total personel online dan menyimpannya;
Kode spesifiknya adalah sebagai berikut:
paket com.facelook.util; impor java.util.map; impor javax.servlet.servletcontext; impor javax.servlet.servletcontextEvent; impor javax.servlet.servletcontextListener; impor javax.servlet.http.httpsessionEvent; impor javax.servlet.http.httpsessionlistener; impor javax.servlet.http.httpsessionlistener; impor org.apache.log4j.logger; impor com.facelook.entity.user; Public Class SessionListener mengimplementasikan httpsessionListener, servletContextListener {private int count; Private ServletContext servletContext = null; public sessionListener () {count = 0; } private Logger Logger = logger.getLogger (this.getClass ()); @Override public void sessioncreated (acara httpsessionEvent) {count ++; setContext (event); logger.info ("************ Sesi http dibuat ... ******************"); } @Override public void sessionDestroyed (acara httpsessionEvent) {// Hapus pasangan nilai kunci yang disimpan di LoginUserMap ketika sesi dihancurkan pengguna pengguna = (pengguna) event.getSession (). GetAttribute ("LoginUser"); if (user! = null) {peta <string, string> loginusermap = (peta <string, string>) event.getSession (). getserVletContext (). getAttribute ("loginusermap"); loginusermap.remove (user.getFuusername ()); event.getSession (). getServletContext (). setAttribute ("LoginUserMap", LoginUserMap); } menghitung--; setContext (event); logger.info ("************ Sesi http dihancurkan ... *********************"); } public void setContext (httpsessionEvent httpsessionEvent) {httpsessionEvent.getSession (). getserVletContext (). setAttribute ("online", count); } @Override public void contextDestroyed (servletContextEvent servletContextEvent) {this.servletcontext = null; Logger.info ("************ Konteks servlet dihancurkan ... *********************"); } @Override public void contextInitialized (servletContextEvent servletContextEvent) {this.servletcontext = servletContextEvent.getSerVletContext (); logger.info ("************ Konteks servlet diinisialisasi ... ******************"); }}2. Buat modul untuk mengelola pengguna online di UserAction dan mendukung fungsi keluar paksa;
/ ** * logout * @return * @throws servletException * @throws IoException */ Public String logout () melempar servletException, ioException {try {peta <string, string> loginusermap = (peta <string, string>) super.getApplicationAttr (constant.login_user_user_map); Pengguna pengguna = (pengguna) super.getSessionAttr (constant.login_user); super.removeattribute (constant.login_user_map); loginusermap.remove (user.getFuusername ()); super.setApplicationAttr (constant.login_user_map, loginusermap); Logger.info ("Login Login Sukses!"); } catch (Exception e) {E.PrintStackTrace (); Logger.Error ("Login Gagal:"+E.GetMessage ()); } return input; } / *** Manajemen Pengguna Online* @return* / Public String LoginManager () {return Success; } / *** paksa keluar dari pengguna lain* @return* / public string logoutother () {coba {string username = servletActionContext.getRequest (). GetParameter ("username"); Peta <String, String> loginUsermap = (peta <string, string>) super.getApplicationAttr (constant.login_user_map); if (username! = null && loginusermap.containskey (username)) {loginusermap.remove (nama pengguna); super.setApplicationAttr (constant.login_user_map, loginusermap); }} catch (Exception e) {e.printstacktrace (); Logger.info ("Keluar secara paksa gagal:"+e.getMessage ()); } return null; }3. Muat daftar pengguna online di halaman manajemen;
Setelah metode yang sesuai didefinisikan, kemudian tambahkan daftar online ke halaman manajemen yang sesuai, sebagai berikut:
<%@page impor = "java.util.map"%> <%@page impor = "java.util.map.entry"%> <%@page language = "java" pageEncoding = "UTF-8"%> <%@incert file = "/common/taglib.jsp"%> <! Doctype html html public "-/taglib.jsp" doctype html html html public "-public" Transisi // en "" http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd "> <html xmlns =" http://www33.org/1999/xhtml "> <pepotper> <www3.org/199/xhtml"> <pepotper> "headper/leadpe = equorg/199/xhtml"> content="text/html; charset=utf-8" /> <title>Welcome to Facelook</title> <%@ include file="/common/resource.jsp" %> <script type="text/javascript"> <!-- // Events $(window).bind('beforeunload',function(){ $.ajax({ URL: "$ {ctx} /system/user/user!logout.action", type: "Post", Success: function () {waspada ("Anda telah keluar"); function logout (userName) {if (username == "$ {sessionscope.loginuser.fuusername}") {alert ("Logout akun Anda!"); kembali; } $ .Ajax ({url: "$ {ctx} /system/user/user!logoutother.action?username ="+username, ketik: "post", success: function () {$ ("#tr"+username) .hide (); var count = parseint ($ ("#count"). $ ("#count"). html (count-1); } //--> </script> </head> <dipt body> <%@ include file = "/common/header.jsp"%> <div id = "main"> <%@ include file = "/common/lefter.jsp"%> <div> <div> <h2> daftar login </h2> <%peta <string, string> peta = (string, string, string, string, peta, string, peta, peta, peta> (string>; out.println ("Saat ini ada <font id = 'count'>"+map.size ()+"</font> pengguna online !!"); %> <able> <%untuk (entri <string, string> m: map.entryset ()) {%> <tr id = "tr <%= m.getKey ()%>"> <td> <%= m.getKey ()%> </td> <td> <a href = "javaScript: logout ('<%= m.get> <) <) <a href =" javaScript: logout (' <%= m.gety () <a) <a) <) <) <) <) <a) <a) <a) <a) <a) <a) <a) <a) <a) <a) <%}%> </able> </div> </div> </div> <%@ include file = "/common/footer.jsp"%> <%@ include file = "/common/message.jsp"%> </body> </html>OK, mulai proyek penempatan, lalu mulai layanan, dan masukkan modul manajemen pengguna online. Efek sederhananya adalah sebagai berikut:
Perlu dicatat bahwa pengguna login saat ini tidak diperbolehkan memaksa keluar dari informasi loginnya.
Dengan cara ini, kasus mencegah banyak pengguna masuk pada dasarnya dapat direalisasikan!
Di atas adalah solusi sempurna untuk pengembangan web Java untuk mencegah banyak pengguna masuk berulang kali. 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!