Penjejakan Sesi Servlet
HTTP ialah protokol "tanpa negara", yang bermaksud bahawa setiap kali klien mendapatkan semula halaman web, klien membuka sambungan berasingan ke pelayan web, dan pelayan secara automatik tidak mengekalkan klien sebelumnya meminta sebarang rekod.
Tetapi masih terdapat tiga cara untuk mengekalkan sesi antara klien web dan pelayan web:
Kuki
Pelayan web boleh menetapkan ID sesi unik sebagai kuki kepada setiap pelanggan web dan permintaan seterusnya daripada pelanggan boleh dikenal pasti menggunakan kuki yang diterima.
Ini mungkin bukan kaedah yang cekap kerana banyak penyemak imbas tidak menyokong kuki, jadi kami mengesyorkan agar tidak menggunakan kaedah ini untuk mengekalkan sesi.
Medan borang tersembunyi
Pelayan web boleh menghantar medan borang HTML tersembunyi, bersama-sama dengan ID sesi unik, seperti berikut:
<input type="hidden" name="sessionid" value="12345">
Entri ini bermaksud Kemudian, apabila borang diserahkan, nama dan nilai yang ditentukan dimasukkan secara automatik dalam data GET atau POST. Nilai session_id boleh digunakan untuk menjejaki pelayar web yang berbeza setiap kali pelayar web menghantar semula permintaan.
Ini mungkin cara yang berkesan untuk menjejaki sesi, tetapi mengklik pautan hiperteks biasa (<A HREF...>) tidak akan menyebabkan borang diserahkan, jadi begitu juga borang tersembunyi Menyokong penjejakan sesi biasa.
Penulisan Semula URL
Anda boleh menambahkan beberapa data tambahan pada penghujung setiap URL untuk mengenal pasti sesi dan pelayan akan mengaitkan pengecam sesi dengan data yang disimpan tentang Kesatuan.
Contohnya, http://w3cschool.cc/file.htm;sessionid=12345, pengecam sesi dilampirkan sebagai sessionid=12345 dan pengecam boleh diakses oleh pelayan web untuk mengenal pasti klien.
Penulisan semula URL ialah cara yang lebih baik untuk mengekalkan sesi Ia berfungsi dengan baik apabila penyemak imbas tidak menyokong kuki, tetapi kelemahannya ialah setiap URL dijana secara dinamik untuk diberikan kepada halaman ID sesi dalam halaman HTML statik yang sangat mudah.
Objek HttpSession
Selain daripada tiga kaedah di atas, Servlet juga menyediakan antara muka HttpSession, yang menyediakan cara untuk mengenal pasti pengguna dan menyimpan maklumat tentang pengguna merentas permintaan berbilang halaman atau semasa mengakses tapak web. cara.
Bekas Servlet menggunakan antara muka ini untuk membuat sesi antara klien HTTP dan pelayan HTTP. Sesi berlangsung untuk tempoh masa tertentu dan merangkumi berbilang sambungan atau permintaan halaman.
Anda akan mendapat objek HttpSession dengan memanggil kaedah awam getSession() HttpServletRequest, seperti yang ditunjukkan di bawah:
HttpSession session = request.getSession();
Anda perlu menghantar sebarang kandungan dokumen kepada klien sebelum Panggil request.getSession(). Berikut meringkaskan beberapa kaedah penting yang tersedia dalam objek HttpSession:
序号 | 方法 & 描述 |
---|---|
1 | public Object getAttribute(String name) 该方法返回在该 session 会话中具有指定名称的对象,如果没有指定名称的对象,则返回 null。 |
2 | public Enumeration getAttributeNames() 该方法返回 String 对象的枚举,String 对象包含所有绑定到该 session 会话的对象的名称。 |
3 | public long getCreationTime() 该方法返回该 session 会话被创建的时间,自格林尼治标准时间 1970 年 1 月 1 日午夜算起,以毫秒为单位。 |
4 | public String getId() 该方法返回一个包含分配给该 session 会话的唯一标识符的字符串。 |
5 | public long getLastAccessedTime() 该方法返回客户端最后一次发送与该 session 会话相关的请求的时间自格林尼治标准时间 1970 年 1 月 1 日午夜算起,以毫秒为单位。 |
6 | public int getMaxInactiveInterval() 该方法返回 Servlet 容器在客户端访问时保持 session 会话打开的最大时间间隔,以秒为单位。 |
7 | public void invalidate() 该方法指示该 session 会话无效,并解除绑定到它上面的任何对象。 |
8 | public boolean isNew( 如果客户端还不知道该 session 会话,或者如果客户选择不参入该 session 会话,则该方法返回 true。 |
9 | public void removeAttribute(String name) 该方法将从该 session 会话移除指定名称的对象。 |
10 | public void setAttribute(String name, Object value) 该方法使用指定的名称绑定一个对象到该 session 会话。 |
11 | public void setMaxInactiveInterval(int interval) 该方法在 Servlet 容器指示该 session 会话无效之前,指定客户端请求之间的时间,以秒为单位。 |
Contoh penjejakan sesi
Contoh ini menggambarkan cara menggunakan objek HttpSession untuk mendapatkan masa penciptaan sesi dan masa akses terakhir. Jika sesi itu tidak wujud, kami akan membuat sesi baharu dengan permintaan.
// 导入必需的 java 库 import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.util.*; // 扩展 HttpServlet 类 public class SessionTrack extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 如果不存在 session 会话,则创建一个 session 对象 HttpSession session = request.getSession(true); // 获取 session 创建时间 Date createTime = new Date(session.getCreationTime()); // 获取该网页的最后一次访问时间 Date lastAccessTime = new Date(session.getLastAccessedTime()); String title = "欢迎回到我的网站"; Integer visitCount = new Integer(0); String visitCountKey = new String("visitCount"); String userIDKey = new String("userID"); String userID = new String("ABCD"); // 检查网页上是否有新的访问者 if (session.isNew()){ title = "欢迎来到我的网站"; session.setAttribute(userIDKey, userID); } else { visitCount = (Integer)session.getAttribute(visitCountKey); visitCount = visitCount + 1; userID = (String)session.getAttribute(userIDKey); } session.setAttribute(visitCountKey, visitCount); // 设置响应内容类型 response.setContentType("text/html"); PrintWriter out = response.getWriter(); String docType = "<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n"; out.println(docType + "<html>\n" + "<head><title>" + title + "</title></head>\n" + "<body bgcolor=\"#f0f0f0\">\n" + "<h1 align=\"center\">" + title + "</h1>\n" + "<h2 align=\"center\">Session 信息</h2>\n" + "<table border=\"1\" align=\"center\">\n" + "<tr bgcolor=\"#949494\">\n" + " <th>Session 信息</th><th>值</th></tr>\n" + "<tr>\n" + " <td>id</td>\n" + " <td>" + session.getId() + "</td></tr>\n" + "<tr>\n" + " <td>Creation Time</td>\n" + " <td>" + createTime + " </td></tr>\n" + "<tr>\n" + " <td>Time of Last Access</td>\n" + " <td>" + lastAccessTime + " </td></tr>\n" + "<tr>\n" + " <td>User ID</td>\n" + " <td>" + userID + " </td></tr>\n" + "<tr>\n" + " <td>Number of visits</td>\n" + " <td>" + visitCount + "</td></tr>\n" + "</table>\n" + "</body></html>"); } }
Mengkompilkan Servlet SessionTrack di atas dan mencipta entri yang sesuai dalam fail web.xml. Masukkan http://localhost:8080/SessionTrack dalam bar alamat penyemak imbas Apabila anda menjalankannya buat kali pertama, hasil berikut akan dipaparkan:
Selamat datang ke saya. laman web
Maklumat Sesi
Session 信息 | 值 |
---|---|
id | 0AE3EC93FF44E3C525B4351B77ABB2D5 |
Creation Time | Tue Jun 08 17:26:40 GMT+04:00 2014 |
Time of Last Access | Tue Jun 08 17:26:40 GMT+04:00 2014 |
User ID | ABCD |
Number of visits | 0 |
Cuba jalankan Servlet yang sama sekali lagi, ia akan memaparkan keputusan berikut:
Selamat datang kembali ke tapak web saya
Maklumat sesi
Session 信息 | 值 |
---|---|
id | 0AE3EC93FF44E3C525B4351B77ABB2D5 |
Creation Time | Tue Jun 08 17:26:40 GMT+04:00 2014 |
Time of Last Access | Tue Jun 08 17:26:40 GMT+04:00 2014 |
User ID | ABCD |
Number of visits | 1 |
Padamkan Data Sesi
Apabila anda melengkapkan data sesi pengguna, anda mempunyai pilihan berikut:
Alih keluar yang khusus atribut: Anda boleh memanggil kaedah public void removeAttribute(String name) untuk mengalih keluar nilai yang dikaitkan dengan kunci tertentu. untuk memadam nilai yang dikaitkan dengan kunci tertentu.
Padam keseluruhan sesi: Anda boleh memanggil kaedah public void invalidate() untuk buang keseluruhan sesi sesi.
Tetapkan masa tamat sesi: Anda boleh memanggil kaedah public void setMaxInactiveInterval(int interval) untuk menetapkan tamat masa sesi secara individu.
Log keluar pengguna: Jika anda menggunakan pelayan yang menyokong servlet 2.4, anda boleh memanggil log keluar untuk log keluar klien pelayan web, dan Batalkan semua sesi kepunyaan semua pengguna.
konfigurasi web.xml: Jika anda menggunakan Tomcat, sebagai tambahan kepada kaedah di atas, anda juga boleh mengkonfigurasi tamat masa sesi dalam fail web.xml , seperti Paparan berikut:
<session-config> <session-timeout>15</session-timeout> </session-config>
Tamat masa dalam contoh di atas adalah dalam beberapa minit, yang akan mengatasi tamat masa lalai 30 minit dalam Tomcat.
Kaedah getMaxInactiveInterval() dalam Servlet akan mengembalikan tamat masa sesi, dalam beberapa saat. Jadi, jika tamat masa sesi dikonfigurasikan dalam web.xml hingga 15 minit, getMaxInactiveInterval() akan mengembalikan 900.