Saya baru -baru ini menganggur dan tidak memiliki proyek untuk dilakukan, jadi saya menyelesaikan beberapa masalah umum yang saya temui dalam pekerjaan sehari -hari saya. Pertama-tama, saya memikirkan masalah pembatasan login multi-pengguna. Izinkan saya memberikan beberapa pemikiran tentang masalah ini.
Bacaan terkait:
Java Web Development Solusi Sempurna Untuk Mencegah Banyak Pengguna Login Berulang
1. Adegan desain
1) Pengguna tidak diperbolehkan masuk beberapa tempat secara bersamaan
2) Pengguna telah masuk di A. sekarang diizinkan untuk masuk dari B, tetapi akan memeras A (mengingat bahwa pengguna telah ke B karena beberapa keadaan setelah masuk pada A, tetapi masih ingin melanjutkan pekerjaan sebelumnya, jadi ia perlu masuk ke sistem)
3) Setelah memeras A dari B, sistem akan memberikan prompt ketika A melakukan operasi lain. Pengguna masuk di tempat lain. Jika kata sandi mungkin bocor jika bukan karena operasinya sendiri, harap ubah kata sandi.
2. Peta Ide
Ketika setiap pengguna masuk, kami biasanya menyimpan informasi pengguna di sesi sehingga sistem dapat dengan mudah mendapatkan informasi dasar pengguna saat pengguna melakukan operasi. Namun, sesi ini bersifat pribadi dan hanya terlihat oleh pengguna saat ini (jika Anda setuju bahwa pengguna akan mendapatkan sesi yang berbeda, yang merupakan akar penyebab mengapa beberapa pengguna dapat masuk). Lalu pertanyaannya datang, bagaimana bisa pengguna tahu apakah dia online saat masuk? Saya yakin Anda pintar, Anda sudah berpikir bahwa ini tidak mudah. Bukankah masalah menyimpan informasi pengguna online di tempat umum? Setelah memeriksa secara online, solusinya benar -benar berbeda, dan kira -kira dua jenis berikut.
1) Identifikasi pengguna online dalam database
2) Simpan di Aplikasi
Setelah banyak pertimbangan, kami akan menemukan bahwa Solution 1 perlu memecahkan banyak masalah sulit (keluar dari pengguna abnormal dan status modifikasi di masa depan, sering akses ke database mempengaruhi kinerja, dll.), Yang jelas tidak pantas bagi Anda yang membutuhkan kesempurnaan. Jadi kami mengadopsi Solution 2, menyimpan informasi pengguna online ke dalam aplikasi, dan desain spesifiknya adalah sebagai berikut.
1) Bagan aliran login
2) Bagan Aliran Operasi setelah diperas
3. Kode
1) Metode login
@RequestMapping (value = "/Login", Method = requestMethod.post) Public String Login (nama pengguna string, kata sandi string, redirectattribute redirectattributes, httpservletrequest permintaan) {/hakim apakah pengguna telah online dan diproses (hapus online) string loinImite = limitlog. Hasil string yang benar = UserserVice.login (nama pengguna, kata sandi); if (result.equals ("success")) {request.getSession (). setAttribute ("now_user", userservice.findbyusername (username)); // buat token dan verifikasi string jwttoken = tokenservice.createUsauthoken (userservice.findbyusname (username)); Tokensystem.out.println (jwttoken); userauthenticationToken authToken = tokenservice.retrieveuserauthtoken (jwttoken); // token parses system.out.println (authToken.isAuthenticated ()); System.out.println ("ID =" UserauthenticationToken.getCurrentToken (). GetUseruuid ()); // Pengguna terputus dan mengarahkan kembali ke tautan yang disimpan setelah masuk. Objek url = request.getSession (). GetAttribute ("redirect_link"); if (url! = null) {request.getSession (). RemoveAttribute ("redirect_link"); return "redirect:" + url.toString ();} return "index";} redirectattributes.addflashattribute ("pesan", hasil); return "redirect:/lainnya2) Masuk untuk menentukan apakah sudah online
@Service @TransactionAlpublic Class Limitelogin {private static logger log = logger.getLogger (sessionListener.class); peta statis pribadi <string, string> loginusermap = hashmap baru <> (); // pengguna penyimpanan peta statis pribadi <string, string> loginouttime = new hashmap <) (); LOGINIMITE (Permintaan httpserVletRequest, string username) {user user = userservice.findbyusername (username); string sessionId = request.getSession (). getId (); untuk (tombol string: loginusermap.keyset ()) {// pengguna telah masuk ke tempat lain (keyufyermap.eqeyset ()) {) {) {) {) {) {) {) {) {// pengguna telah masuk ke tempat lain (KEYUSERMAP.KEYSET ()) {) {) {) {) {) {) {) {) {) {) {) {) {) {) {) {) {) {) {) {) {) {) {) {) {) {) {) {) {) {) {) ! LOGINUSERMAP.ContainSValue (sessionID)) {log.info ("user:" + user.getusername () + ", dalam" + dateUtil.DateFormat (date baru (), "yyyy-mm-dd hh: mm: ss") + "dikecualikan!"); loouttime.put. "YYYY-MM-DD HH: MM: SS")); loginusermap.remove (user.getusername ()); break;}} loginusermap.put (user.getusername (), sessionId); request.getSession (). GetServletContext (). loginusermap); request.getSession (). getserVletContext (). setattribute ("LoginoutTime", LoginOuttime); return "Success";}}3) Login Interceptor (tidak ada login untuk melompat ke halaman login)
Kelas Publik LoginInceptor memperluas handlerInterceptorAdapter {@Overridepublic boolean prehandle (httpservletRequest, httpservletResponse response, objek handler) melempar exception {httpsession = now -neKe (get (); user user = (user) session.getTribute ("now -now -now -now -nowe () (); pengguna pengguna = (user) sesi == null) {response.sendRedirect(request.getContextPath() + "/other/toLogin");return false;}//Multi-user login restriction judgment, and give a prompt message boolean isLogin = false;if (user != null) {Map<String, String> loginUserMap = (Map<String, String>) session.getSerVletContext (). getAttribute ("loginusermap"); string sessionid = session.getId (); untuk (tombol string: loginusermap.keyset ()) {// pengguna telah masuk ke tempat lain jika (key.equals (User.getUserName ()) &&! LOGINUMAP.CONAINS = true; break;}}} if (isLogin) {peta <string, string> loginouttime = (peta <string, string>) session.getSerVletContext (). getAttribute ("LoginOuttime"); session.setAttribute ("mess", "user:" + User.getusername () + "," + " +" + " +" + " +" + " +" + " +" + " +" + " +" + " +" + " +" + " +" + " +" + " +" + " +" + " +" di tempat lain! "); loginouttime.remove (user.getUserName ()); session.getServletContext (). setattribute (" loginusermap ", loginouttime); response.sendredirect (request.getContextPath () +"/lainnya/tOGIN "); return false;} return. postHandle(HttpServletRequest request,HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {super.postHandle(request, response, handler, modelAndView);}@Overridepublic void afterCompletion(HttpServletRequest request,HttpServletResponse response, Object handler, Exception ex)throws Pengecualian {super.aftercompletion (permintaan, respons, pawang, ex);}}4) Saat sesi dihancurkan, hapus pasangan nilai kunci yang disimpan dalam loginusermap
Public ClassSessionListener mengimplementasikan httpsessionListener {private static logger log = logger.getLogger (sessionListener.class);@overridepublic void sessioncreated (httpsessionEvent event) {} @overridepublic void sessionDestroyed (httpsessionSessionEnvent event {httpsession {httpsesion {httpession {httpession {httpession {httpession (httpession {httpession {httpessies session.getId (); // Saat sesi dihancurkan, hapus pasangan nilai kunci yang disimpan di pengguna loginusermap pengguna = (user) session.getAttribute ("now_user"); if (user! = null) {peta <string, loginusermap = (peta <string, string>) event.getSession (). getSerVletContext (). getAttribute ("LOGINUSERMAP"); if (LOGINUSERMAP.get (user.getUserName ()). Equals (sessionId)) {log.info ("Bersihkan pengguna dari aplikasi:" + user.getUserName ()); loginusermap.remove (user.getUserName ()); event.getSession (). getservletcontext (). setattribute ("loginusermap", loginusermap);}}}}5) web.xml
<!-Pembatasan login multi-pengguna Sesi, keluar untuk menghapus informasi sesi sambil membersihkan informasi login pengguna yang disimpan dalam aplikasi-> <dengarerer> <Distener-Class> com.service.limitelogin.SessionListener </engeaner-class> </engeaner>
6) Kode halaman (digunakan untuk menghapus informasi sesi pengguna yang diperas sambil memberikan prompt, jika tidak informasi prompt akan ditampilkan sepanjang waktu)
<script type = "text/javaScript"> $ (document) .ready (function () {var message = '$ {mess}'; if (pesan! = "") {$ .Ajax ({type: 'get', async: false, cache: false, url: '/lain/cleareSessession', DataType: ', Data: {{{{{{{{{{{{{{{{{{{{{{{{funche: {{funche: {{funche: {{funche: {}}); $ ('#mess'). html (pesan);}}); </skrip>7) Hapus kode sesi pengguna
/*** Pembatasan Login Multi-Pengguna, Hapus Informasi Sesi (Informasi Login, Informasi Prompt) ** @param Permintaan*@return*/ @responseBody @requestMapping (value = "/clearUsersession") Public String clearUsersession (httpservletRequest Request) {httpsession httppsession = request.getSession (); // httpsession.invalidate (); httpsession.removeattribute ("now_user"); httpsession.removeattribute ("mess"); kembalikan "sukses";}Pekerjaan pengembangan selesai di sini
4. Hasil Operasi
Di atas adalah metode implementasi pembatasan login multi-pengguna Java yang diperkenalkan kepada Anda oleh editor. Saya harap ini akan membantu Anda. Jika Anda memiliki pertanyaan, silakan tinggalkan saya pesan dan editor akan membalas Anda tepat waktu. Terima kasih banyak atas dukungan Anda ke situs web Wulin.com!