Artikel ini terutama memperkenalkan penggunaan sesi mendengarkan di Java untuk mencapai pembatasan login dan jumlah login untuk akun yang sama. Kode spesifiknya adalah sebagai berikut:
Domain Masalah:
1. Masuk dengan akun yang sama: Jika akun ini sudah masuk, Anda tidak dapat masuk lagi (sebaliknya dengan mode QQ).
2. Jika jumlah yang masuk terbatas, jika jumlah orang melebihi atau telah tercapai, promptnya adalah: sistemnya sibuk, coba lagi nanti.
Solusi: Gunakan pendengar httpsessionattributeListener (walaupun saya menggunakan httpsessionlistener pada saat yang sama, rasanya sulit untuk beroperasi)
Cadangan Pengetahuan: HttpSsionAttributeListener memiliki tiga metode: AttributeAdd, AttributeMove, dan AttributePlept.
SetAttribute dan RemoveAttribute dari sesi ini akan memicu metode atributeAdd dan attributereMove. Pengaturan berulang dari atribut yang sama dari sesi yang sama akan memicu metode AtributeReplept.
Alasan mengapa httpsessionListener sulit dioperasikan: Selama Anda mengakses halaman JSP, Anda akan membuat sesi (Anda tidak akan membuat sesi saat mengakses HTML. Di sisi server, misalnya, jika Anda memanggil httpservletrequest.getSession (true) di servlet, Anda akan membuatnya). JSP adalah halaman yang dinamis, dan pada dasarnya adalah servlet. Login.jsp saya jelas merupakan JSP. Ketika saya membatalkan sesi di pendengar dan kembali ke halaman login, saya segera membuat sesi lain. Ini adalah sesuatu yang saya tidak merasa jelas, dan saya belum pulang dari keterampilan saya.
Implementasi spesifik:
Kode pendengar
kelas publik OnlineListener mengimplementasikan httpsessionListener, httpsessionattributeListener {daftar statis privat <sessionAnduser> sesi; statis int del = -1; Bendera boolean statis = false; static {if (session == null) {sessions = collections .synchronizedList (arraylist baru <ssionAndUser> ()); }} public void sessioncreated (httpsessionEvent hse) {System.out.println (hse.getSession () + "-" + new date ()); System.out.println (hse.getSession () + "-" + new Date ()); } public void sessionDestroyed (httpsessionEvent hse) {System.out.println ("------------- SesiesDestroyed () -----------"); System.out.println (hse.getSession () + "" + Tanggal Baru (hse.getSession (). GetLastAccessedTime ())); System.out.println (hse.getSession () + "" + new Date ()); } public void atributeadded (httpsessionBindingEvent e) {System.out.println ("-------------*Mulai ditambahkan*-----------------------" + sesions.size ()); Httpsession sesi = e.getSession (); ActionContext ctx = actionContext.getContext (); boolean newone = true; String attrname = e.getname (); // Masuk if (attrname.equals (constant.user_name)) {// periksa jumlah login if (sesions.size ()> = constant.user_limit) {newOne = false; ctx.put ("timeoutmsg", "serverbusy"); } String nowUser = (string) e.getValue (); // Lintasi semua sesi untuk memeriksa apakah Anda telah masuk. Jika demikian, itu meminta agar Anda telah masuk untuk (int i = sesi. if (tem.getUserName (). Equals (nowUser)) {newOne = false; ctx.put ("timeoutmsg", "loged"); // tem.getSession (). Invalidate (); // // masuk dengan akun yang sama dan secara otomatis memanggil hapus break; }} // Tambahkan akun login baru ke daftar pemeliharaan akun jika (newOne) {sessionAndUser sau = sessionAndUser (); Sau.setusername (NowUser); Sau.setession (sesi); sau.setsid (session.getId ()); session.add (SAU); }}} public void atrutButeReMoved (httpsessionBindingEvent e) melempar IllegalStateException {httpsession sesi = e.getSession (); System.out .println ("-------------*Mulai Dihapus*-----------------------" + sesi.size ()); if (dels> -1) {if (flag) {sesions.remove (dels); bendera = false; }} else {// 登录 string attrname = e.getname (); if (attrname.equals (constant.user_name)) {string nowUser = (string) e.getValue (); // lintasi semua sesi untuk (int i = session.size ()-1; i> = 0; i--) {sessionAnduser tem = session.get (i); if (tem.getUserName (). Equals (nowUser)) {sessions.remove (i); merusak; }}}}} public void attributeReplaced (httpsessionBindingEvent e) {httpsession session = e.getSession (); System.out .println ("-------------*Mulai ganti*-----------------------" + sesi.size ()); String attrname = e.getname (); del = -1; // 登录 if (attrname.equals (constant.user_name)) {// user nowuser = (user) e.getValue (); // nilai lama string nowuser = (string) session.getattribute (constant.user_name); // 当前 sesi 中的 pengguna // melintasi semua sesi untuk (int i = i = scions. tem = sesions.get (i); if (tem.getUserName (). Equals (nowUser) &&! tem.getSid (). Equals (session.getId ())) {System.out.println ("Hapus: Invalidasi 1!"); del = i; bendera = true; } else if (tem.getSid (). equals (session.getId ())) {tem.setusername (nowUser); }} if (dels! = -1) {sesions.get (dels) .getSession (). Invalidate (); // metode hapus secara otomatis dipanggil ketika gagal. Itu juga akan dihapus dari sesi}}}} Gagasan utama dari kode ini adalah untuk mendefinisikan daftar statis <sessighter> untuk menyimpan sesi dan nama akun.
Kode untuk mendapatkan nilai pengembalian pendengar dan memprosesnya dalam tindakan masuk
session.setAttribute (constant.user_name, operator.getusername ()); ActionContext ctx = actionContext.getContext (); if ("ServerBusy" .Equals (ctx.get ("timeoutmsg"))) {ctx.put ("timeoutmsg", "server sibuk, coba lagi nanti"); mengembalikan "lompat"; } if ("beenloged" .equals (ctx.get ("timeoutmsg"))) {ctx.put ("timeoutmsg", "akun ini masuk ke tempat lain"); mengembalikan "lompat"; } Kode Informasi Prompt Pengambilan Halaman
<%@taglib awalan = "s" uri = " /struts-tags"%> <s: nilai properti = "#attr.TimeOutMSg" />
Terima kasih telah membaca, saya harap ini dapat membantu Anda. Terima kasih atas dukungan Anda untuk situs ini!