Sebagai bintang yang sedang naik daun, JSP dapat menempati posisi tertentu dalam lingkungan pemrograman server, yang berkaitan erat dengan dukungannya yang baik terhadap serangkaian standar industri. Sesi adalah salah satu infrastruktur yang disediakannya. Sebagai seorang programmer, Anda dapat dengan mudah menerapkan manajemen pengguna berbasis sesi sederhana tanpa mengkhawatirkan cara penerapannya pada klien. Ada beberapa cara berbeda untuk menangani pengguna online saat ini.
Salah satunya adalah penyegaran halaman dikontrol oleh pengguna, dan server mengontrol batas waktu seperti 30 menit. Setelah waktu habis, pengguna akan dikeluarkan jika tidak ada tindakan. Keuntungan dari metode ini adalah jika pengguna lupa logout, hal ini dapat mencegah orang lain melakukan operasi berbahaya. Kekurangannya adalah jika Anda melakukan sesuatu yang memakan banyak waktu dan melebihi batas waktu tersebut, Anda mungkin harus login lagi saat mengirimkan. Jika permukaan daun asli dipaksa rusak lagi, Anda mungkin kehilangan pekerjaan yang telah Anda lakukan. Dari perspektif implementasi, ini adalah yang paling sederhana, dan sisi server mengimplementasikan mode ini secara default.
Cara lainnya adalah situs mengadopsi struktur frame, dan terdapat Frame atau iframe tersembunyi yang terus disegarkan, sehingga Anda tidak akan pernah dikeluarkan. Namun, untuk menentukan apakah Anda sedang online, server perlu menyetel a waktu linglung. Jika Anda melebihi waktu linglung ini, Jika Anda tidak me-refresh halaman lain kecuali halaman yang di-refresh secara otomatis ini, Anda dianggap tidak lagi online. Contoh tipikal dari pendekatan ini adalah xici.net. Keuntungannya adalah dapat menggunakan penyegaran berkelanjutan untuk mengimplementasikan beberapa fungsi seperti server-push, seperti mengirim pesan antar netizen.
Apa pun mode yang digunakan, beberapa pekerjaan tambahan perlu dilakukan untuk menelusuri semua pengguna yang sedang online. Tidak ada API untuk mendapatkan daftar Sesi di API Servlet.
Yang bisa digunakan adalah Listener. Spesifikasi Servlet 2.2 dan 2.3 sedikit berbeda di sini. HttpSessionBindingListener di 2.2 dapat mengimplementasikan kelas yang memberi tahu Anda ketika Atribut dalam HTTPSession berubah.
HttpSessionAttributeListener juga diperkenalkan di 2.3. Karena lingkungan yang saya gunakan adalah usia Visual untuk Java 4 danJRun
server 3.1, mereka tidak secara langsung mendukung pemrograman Servlet 2.3. Di sini saya menggunakan HttpSessionBindingListener
mengimplementasikan antarmuka HttpSessionBindingListener. Antarmuka ini memiliki dua metode:
public void valueBound(HttpSessionBindingEvent event)
public void valueUnbound(HttpSessionBindingEvent event)
Saat Anda menjalankan Session.addAttribute(String,Object), jika Anda telah menambahkan kelas yang mengimplementasikan antarmuka HttpSessionBindingListener sebagai Atribut, Session akan memberi tahu kelas Anda dan panggil metode valueBound Anda. Sebaliknya, metode Session.removeAttribute sesuai dengan metode valueUndound.
public class HttpSessionBinding mengimplementasikan javax.servlet.http.HttpSessionBindingListener
{
Aplikasi ServletContext = null;
public HttpSessionBinding(Aplikasi ServletContext)
{
super();
if (application ==null)
throw new IllegalArgumentException("Aplikasi null tidak diterima.")
; .application = aplikasi;
}
public void valueBound(javax.servlet.http.HttpSessionBindingEvent e)
{
Vektor activeSessions = (Vektor)application.getAttribute
("activeSessions"
)
;
}
JDBCUser sessionUser = (JDBCUser)e.getSession().getAttribute("pengguna");
if (sessionUser != null)
{
activeSessions.add(e.getSession()
)
;
;
}
public void valueUnbound(javax.servlet.http.HttpSessionBindingEvent e)
{
JDBCUser
sessionUser
= (JDBCUser)e.getSession().getAttribute("user")
;
.getAttribute("activeSessions"
);
if (activeSessions != null)
{
activeSessions.remove(e.getSession().getId());
application.setAttribute
(
"
activeSessions",activeSessions)
;
Kelas adalah kelas Pengguna yang berubah-ubah. Saat melakukan login pengguna, tambahkan kelas User dan kelas HttpSessionBinding ke Sesi.
Dengan cara ini, setiap kali pengguna login, sebuah record akan ditambahkan ke vektor atribut "activeSessions" dalam aplikasi. Setiap kali sesi habis, valueUnbound dipicu, dan sesi yang akan habis waktunya dihapus dari vektor ini
public void login()
melempar ACLException,SQLException,IOException
{
/* get JDBC User Class */
if (user != null )
{
logout ();
}
{
//jika
waktu sesi habis, atau pengguna tidak login, simpan url target untuk sementara.
JDBCUserFactory uf = new JDBCUserFactory();
=null) ||.(this.request.getParameter("password")==null) )
{
throw new ACLException("Harap masukkan nama pengguna dan kata sandi yang valid."
}
JDBCUser user = (JDBCUser) uf.UserLogin(
this .request.getParameter("userID"),
this.request.getParameter("password") );
pengguna.touchLoginTime();
this.session.setAttribute("user",user
this.session.setAttribute("BindingNotify"); ,new HttpSessionBinding (aplikasi));
}
}
Saat masuk, tambahkan kelas tujuan Pengguna dan BindingNotofy ke sesi. Saat keluar, Anda harus secara aktif menghapus sesi dalam vektor activeSessions
public void logout()
throws SQLException,ACLException
{
if (this.user == null && this.session.getAttribute("user")==null)
{
return ;
}
Vektor activeSessions = (Vektor)
this.application.getAttribute("activeSessions");
if
(activeSessions != null)
{
activeSessions.remove(this.sessions)
;
util.Enumeration e = this.session.getAttributeNames();
while (e.hasMoreElements())
{
String s = (String)e.nextElement();
this.session.removeAttribute
(s)
; );
this.user = null;
}
Kedua fungsi ini terletak di kelas HttpSessionManager. Kelas ini mengacu pada objek global aplikasi di jsp. Kode lain dari kelas ini tidak ada hubungannya dengan artikel ini dan cukup panjang, jadi saya tidak akan mempostingnya.
Mari kita lihat cara menggunakannya di JSP.
Asumsikan formulir login dikirimkan ke doLogin.jsp, dan formulir berisi kolom Nama Pengguna dan kata sandi. Kutipan:
<%
HttpSessionManager hsm = new HttpSessionManager(aplikasi, permintaan, respons);
coba
{
hsm.login();
}
catch (UserNotFoundException e)
{
respon.sendRedirect("InsufficientPrivilege.jsp?detail=User%20does%20not %20exist .");
return;
}
catch (InvalidPasswordException e2)
{
respon.sendRedirect("InsufficientPrivilege.jsp?detail=Invalid%20Password");
return;
}
catch (Pengecualian e3)
{
%> Kesalahan:<%=e3.toString( ) %><br>
Tekan <a href="login.jsp">Di sini</a> untuk login kembali.
<
%
return;
}
respon.sendRedirect("index.jsp");
miliki sekarang Cara mendapatkan daftar pengguna yang sedang online.
<body bgcolor="#FFFFFF">
<table Cellspacing="0" cellpadding="0" width="100%">
<tr >
<td style="width:24px">SessionId
</td>
<td style= "width:80px" >Pengguna
</td>
<td style="width:80px" >Waktu Masuk
</td>
<td style="width:80px" >Waktu Akses Terakhir
</td>
</tr>
<%
Vektor activeSessions = (Vektor) application.getAttribute("activeSessions");
if (activeSessions
== null)
{
activeSessions = new Vector();
application.setAttribute("activeSessions",activeSessions)
;
;
while (it.hasNext())
{
HttpSession sess = (HttpSession)it.next();
JDBCUsersessionUser
= (JDBCUser)sess.getAttribute("userId");
():"Tidak ada";
%>
<tr>
<td nowrap=''><%= sess.getId() %></td>
<td nowrap=''><%= userId %></td>
<td nowrap=''>
<%= BeaconDate.getInstance( Java.util.Date baru(sess.getCreationTime())).getDateTimeString()%></td>
<td class="<%= stl %>3 " nowrap=''>
<%= BeaconDate.getInstance( new java.util.Date(sess.getLastAccessedTime())).getDateTimeString()%></td>
</tr>
<%
}
%>
</table>
</body>
Kode di atas mengambil activeSessions dari aplikasi dan menampilkan waktu tertentu. Kelas BeaconDate diasumsikan sebagai kelas waktu yang diformat.
Dengan cara ini, kami mendapatkan kerangka untuk melihat daftar pengguna online. Adapun paging daftar pengguna online dan fungsi lainnya, tidak relevan dengan artikel ini dan tidak akan dibahas.
Ini adalah contoh model non-refresh yang mengandalkan mekanisme batas waktu sesi. Rekan saya sonymusic menunjukkan bahwa sering kali hal ini mungkin tidak dapat diandalkan karena perbedaan ide dari masing-masing produsen. Mempertimbangkan persyaratan ini, penting untuk menentukan apakah waktu sejak penggunaan terakhir oleh pengguna saat ini melebihi nilai waktu yang telah ditentukan saat setiap permukaan daun disegarkan. Ini pada dasarnya menerapkan batas waktu sesi sendiri. Jika Anda perlu menerapkan model penyegaran, Anda harus menggunakan metode menilai penyegaran untuk setiap permukaan daun.