Fungsi masuk tunggal masih sangat penting dalam skenario aplikasi yang sebenarnya. Secara logis, kami tidak mengizinkan pengguna untuk melakukan dua operasi secara bersamaan. Mari kita pelajari tentang implementasi masuk tunggal SpringMVC.
Interceptor SpringMVC berbeda dari Interceptor Spring. SpringMVC memiliki DispatcherServlet entri terpadu. Semua permintaan melewati DispatcherServlet, jadi Anda hanya perlu membuat keributan pada DispatcherServlet. DispatcherServlet tidak memiliki proxy, dan pengontrol yang dikelola oleh SpringMVC tidak memiliki proxy.
1. Pertama -tama Jelajahi Prinsip Implementasi Dasar: Fungsi ini relatif sederhana, yaitu, hanya satu pengguna yang dapat beroperasi pada proyek web yang sama pada saat yang sama, jadi di sini adalah penemuan login jarak jauh, dan dua jalur diperkenalkan di sini. 1. Server menemukan bahwa pengguna yang masuk telah melakukan operasi login lagi melalui IP lain, dan kemudian secara aktif mendorong pengingat untuk memberi tahu pengguna pertama untuk masuk login jarak jauh; 2. Ketika pengguna melakukan operasi, ia menemukan bahwa akunnya telah diperas dan ada login jarak jauh. Mengenai dua solusi ini, yang pertama lebih real-time tetapi masih dieksplorasi. Mari kita fokus pada metode kedua di bawah ini.
2. Menerapkan tipe kedua relatif sederhana. Ada dua operasi. Salah satunya adalah menambahkan bidang tambahan ke sessionID pengguna untuk menyimpan sessionID pengguna yang masuk, karena setiap permintaan sesuai dengan sessionID non-resetitif yang unik. Kemudian, menggunakan teknologi interceptor, mencegat operasi pengguna. Di Interceptor, permintaan URL yang relevan pada halaman login pertama kali dirilis, dan yang lainnya adalah permintaan verifikasi login dirilis. Akhirnya, filter pengguna. (Tentang login pengguna, ketika verifikasi berhasil, tidak hanya pengguna harus disimpan dalam sesi untuk verifikasi intersepsi login, tetapi juga ID sesi perlu disimpan di sesi yang sesuai di tabel pengguna.) Untuk permintaan permintaan kali ini, Anda dapat memperoleh sesi dan ID -nya dan kemudian membandingkan apakah hal yang sama dengan sessionID dalam database menurut ID ini, dan kemudian melewati. Jika perbedaannya, login lompatan offline akan diminta untuk melompat ke dalam login, karena akan ada sesi dalam operasi server koneksi pengguna. Selama sesi berakhir, ID sesi dari setiap operasi yang diinisiasi pengguna adalah sama, sehingga akan cocok dengan ID yang disimpan dalam database saat masuk. Ketika orang lain melewati perangkat lain, gunakan akun yang sama untuk dimasukkan. Sesi ini akan dibangun kembali saat masuk. Sesi dalam database akan menyegarkan sessionID dalam database, tetapi sessionID masih belum berubah. Namun, sesi dalam database telah berubah. Oleh karena itu, ketika memverifikasi apakah sessionID dalam database konsisten di pencegat, ia akan gagal untuk mencegat operasi pengguna untuk mencapai fungsi login pengguna tunggal. (A note about Session, when the user first connects to the server, a Session will be created on the server side, and then every operation initiated by the user will carry the id of this Session, and some situations will occur. The user has not operated with the server for a long time. The user logs out and actively makes the Session invalid. The user closes the browser, or restarts the server)
Berikut ini adalah implementasi pencegat di SpringMVC
Public Class SingleUserInterceptor mengimplementasikan handlerInterceptor {@AutoWiredPrivate Usermapper mapper; public void aftercompletion (httpservletrequest arg0, httpservletResponse arg1, objek arg2, pengecualian arg3) melempar pengecualian {// tODO Metode auto-generated stub} public void-copol public voiddion {// TODO Metode Auto-Generated Stubered Stub} Public Void Public Void HttpservletResponse arg1, objek arg2, model dan arg3) melempar pengecualian {// toddo metode yang dihasilkan secara otomatis} public boolean prehandle (httpservletrequest arg0, httpservletResponse arg1, objek arg2) lemparan pengecualian {string url = arg0.getes arget (get (get (get (gety (get (httpserponse (objek arg2) lempar {string url = arg0.geteRponse arg1, objek arg2) pengecualian {string URL = arg0.getePespons if (url.indexof ("login.jsp")> = 0 || url.indexof ("baru/login")> = 0 || url.indexof ("checkUser")> = 0) {return true;} // Jika nama pengguna ada (yaitu, login dan rilis) integer user = (integer) arg0.getSession (). getAttribute ("user"); if (user! = null) {string sessionid = mapper.getUserentity (integer.valueof (pengguna)). getSessionId (); if (sessionid.equals (arg0.getSession (). getId ())) {return true;} (arg0.getSession (). else {arg1.setstatus (arg1.sc_gateway_timeout); arg1.setContentType ("text/html; charset = utf-8"); printwriter out = arg1.getWriter (); out.println ("<html>"); out.println ("<cripter>" <html> "); out.println (" <outprintln ("" <html> "); out.println (" <script> "<html>"); out.println ("<script>" <html> "); out.println (" <script> (""; Di tempat lain, Anda terpaksa pergi offline ') "); out.println (" window.open (' " + arg0.getContextPath () +" /new/login' ,'_top');");out.println("</script>");out.println("</htmln("</script>");out.println("</htmln("</script>"); arg0.getRequestDispatcher ("login.jsp"). Forward (arg0, arg1); return false;}} arg0.getRequestDispatcher ("login.jsp"). Forward (arg0, arg1); return false;}}Kode di atas dapat mewujudkan fungsi pengguna yang masuk pertama yang diperas dari garis ketika pengguna yang sama log dalam beberapa kali. Ini dapat mewujudkan fungsi meminta akun untuk masuk dari jarak jauh dan kemudian melompat ke halaman login. Di sini kita perlu menjelaskan poin -poin penting dari fungsi prompt peringatan sederhana ini. Jika peringatan ini muncul, ia harus dapat mengakhiri permintaan. Kemudian fungsi pencetakan respons menghasilkan pernyataan prompt peringatan, sehingga pernyataan lompatan yang dikomentari tidak dapat ada. Jika ada, pernyataan prompt peringatan tidak akan dikeluarkan, karena operasi Anda tidak berakhir dengan benar tetapi diteruskan atau dialihkan ke operasi lain. Apakah itu benar atau tidak, itu akan menjadi output dari tindakan lain ke halaman, jadi pernyataan cetak respons Anda tidak akan muncul. Jadi cara yang benar adalah: permintaan pencegat tidak dirilis (returnFalse), dan permintaan masih merupakan permintaan asli dan tidak akan melompat. Informasi pencetakan respons kembali ke halaman dapat ditampilkan. Adapun untuk melompat ke halaman login, Anda dapat menggunakan: out.println ("window.open ('"+arg0.getContextPath ()+"/baru/login', '_ top');"); Untuk mengimplementasikan bahwa permintaan tindakan dijalankan di bagian output JS dengan respons, menunjuk ke halaman login.
Kode di atas pada dasarnya telah dianggap sebagai fungsi login pengguna tunggal, tetapi Anda akan menemukan bahwa pengoperasian permintaan AJAX tidak menunjuk ke halaman login saat login di lokasi jarak jauh, dan tidak ada informasi yang cepat. Izinkan saya menjelaskan alasannya terlebih dahulu, karena AJAX Anda membuat permintaan yang tidak sinkron, dan URL yang diminta juga dicocokkan dalam prosesor mapper, sehingga akan dianggap sebagai permintaan berhasil (kode status pengembalian adalah 200). Pernyataan JS yang dicetak dalam respons di atas akan menjadi permintaan yang berhasil dalam keberhasilan, dan nilai pengembalian. Anda dapat mencoba mengomentari kalimat di atas: arg1.setstatus (arg1.sc_gateway_timeout); Pada saat ini, beberapa operasi lain perlu dilakukan. Yang pertama adalah pernyataan arg1.setstatus (arg1.sc_gateway_timeout); Fungsinya adalah mengatur kode status yang dikembalikan oleh tanggapan. Pengaturan di atas menunjukkan bahwa kode status 504 akan dikembalikan untuk mewakili kesalahan permintaan. Pada saat ini, permintaan AJAX tidak akan lagi merespons dalam metode keberhasilan, tetapi akan menanggapi metode kesalahan AJAX. Oleh karena itu, Anda hanya perlu menjalankan metode yang sesuai dalam kesalahan AJAX, misalnya:
$ .AJAX ({url: 'baru/msd2', Success: function (a) {alert (a);}, error: function (rs) {if (rs.status == 504) {document.write (rs.Responsetext);}}});Ketika permintaan AJAX dicegat karena login jarak jauh, atur arg1.setstatus (arg1.sc_gateway_timeout); Status pengembalian permintaan dapat diubah menjadi 504. Kemudian metode kesalahan merespons. Ketika ditentukan bahwa status adalah kode status yang Anda atur, Document.write (Rs.Responsetext); ResponseText adalah pernyataan JS yang dicetak ke meja depan di Interceptor. Untuk pernyataan ini dieksekusi, dokumen.write (); Metode perlu menulis kode ke DOM agar berlaku. Pada titik ini, semua permintaan dan masuk tunggal untuk permintaan AJAX asinkron pada dasarnya telah diimplementasikan.
Tinggalkan artikel ini hanya untuk merekam kode kunci, ide, dan prinsip operasi
Meringkaskan
Di atas adalah semua tentang implementasi masuk tunggal di SpringMVC Interceptor, saya harap ini akan membantu semua orang. Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya. Terima kasih teman atas dukungan Anda untuk situs ini.