Sesi JSP


HTTP ialah protokol tanpa kewarganegaraan, yang bermaksud bahawa setiap kali klien mendapatkan semula halaman web, sambungan pelayan yang berasingan dibuka, jadi pelayan tidak merekodkan sebarang maklumat daripada permintaan pelanggan sebelumnya.

Terdapat tiga cara untuk mengekalkan sesi antara pelanggan dan pelayan:


Kuki

Pelayan web boleh menetapkan ID sesi unik sebagai kuki untuk mewakili setiap pelanggan dan menggunakannya untuk mengenal pasti permintaan seterusnya daripada pelanggan ini.

Ini mungkin bukan cara yang cekap, kerana banyak kali penyemak imbas tidak semestinya menyokong kuki, jadi kami tidak mengesyorkan menggunakan kaedah ini untuk mengekalkan sesi.


Medan borang tersembunyi

Pelayan web boleh menghantar medan borang HTML tersembunyi dan ID sesi unik, seperti ini:

<input type="hidden" name="sessionid" value="12345">

Entri ini bermakna apabila borang diserahkan, Nama dan nilai yang ditentukan akan dimasukkan secara automatik dalam data GET atau POST. Setiap kali penyemak imbas menghantar permintaan, nilai session_id boleh digunakan untuk menyimpan kesan pelayar yang berbeza.

Pendekatan ini mungkin pendekatan yang cekap, tetapi mengklik pada hiperpautan dalam teg <A HREF> tidak menjana acara penyerahan borang, jadi medan borang tersembunyi tidak menyokong penjejakan sesi universal.


Menulis semula URL

Anda boleh menambah beberapa data tambahan selepas setiap URL untuk membezakan sesi dan pelayan boleh mengaitkan pengecam sesi berdasarkan data ini.

Contohnya, http://w3cschool.cc/file.htm;sessionid=12345, pengecam sesi ialah sessionid=12345, pelayan boleh menggunakan data ini untuk mengenal pasti klien.

Sebagai perbandingan, menulis semula URL adalah cara yang lebih baik walaupun penyemak imbas tidak menyokong kuki, tetapi kelemahannya ialah anda mesti menentukan secara dinamik ID sesi untuk setiap URL, walaupun ini adalah satu. halaman HTML mudah.


objek sesi

Sebagai tambahan kepada kaedah di atas, JSP menggunakan antara muka HttpSession yang disediakan oleh servlet untuk mengenal pasti pengguna dan menyimpan semua maklumat akses pengguna ini.

Secara lalai, JSP membenarkan penjejakan sesi dan objek HttpSession baharu akan dijadikan instantiated secara automatik untuk pelanggan baharu. Melumpuhkan penjejakan sesi memerlukan pematikan secara eksplisit, yang dicapai dengan menetapkan nilai atribut sesi dalam arahan halaman kepada palsu, seperti berikut:

<%@ page session="false" %>

Enjin JSP mendedahkan objek sesi tersirat kepada pembangun. Memandangkan objek sesi disediakan, pembangun boleh menyimpan atau mendapatkan semula data dengan mudah.

Jadual berikut menyenaraikan beberapa kaedah penting bagi objek sesi:

S.N.Kaedah & Penerangan
1Objek awam getAttribute(Nama rentetan)


Mengembalikan objek yang terikat kepada nama yang ditentukan dalam objek sesi Jika ia tidak wujud, mengembalikan null
2Penghitungan awam getAttributeNames()


Mengembalikan semua nama objek dalam objek sesi
3public long getCreationTime()


Mengembalikan masa apabila objek sesi dicipta, dalam milisaat, bermula dari awal pagi 1 Januari 1970
4public String getId()


Kembalikan ID objek sesi
5public long getLastAccessedTime()


Mengembalikan masa akses terakhir pelanggan, dalam milisaat, bermula dari awal pagi 1 Januari 1970
6public int getMaxInactiveInterval()


Mengembalikan selang masa maksimum, dalam saat, di mana bekas servlet akan memastikan sesi terbuka
7kekosongan awam tidak sah()


Batalkan sesi dan lepaskan sebarang objek yang terikat pada sesi
8public boolean isNew(


Mengembalikan sama ada pelanggan baharu atau sama ada pelanggan enggan menyertai sesi
9public void removeAttribute(String name)


Alih keluar objek dengan nama yang ditentukan dalam sesi
10public void setAttribute(String name, Object value)


Gunakan nama dan nilai yang ditentukan untuk menjana objek dan mengikatnya pada sesi
11public void setMaxInactiveInterval(int interval)


Digunakan untuk menentukan masa, dalam saat, semasa bekas servlet akan memastikan sesi sah

Aplikasi Sesi JSP

Contoh ini menerangkan cara menggunakan objek HttpSession untuk mendapatkan masa penciptaan dan masa akses terakhir. Kami akan mengaitkan objek sesi baharu dengan objek permintaan jika ia belum wujud.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.io.*,java.util.*" %>
<%
   // 获取session创建时间
   Date createTime = new Date(session.getCreationTime());
   // 获取最后访问页面的时间
   Date lastAccessTime = new Date(session.getLastAccessedTime());

   String title = "再次访问php中文网实例";
   Integer visitCount = new Integer(0);
   String visitCountKey = new String("visitCount");
   String userIDKey = new String("userID");
   String userID = new String("ABCD");

   // 检测网页是否由新的访问用户
   if (session.isNew()){
      title = "访问php中文网实例";
      session.setAttribute(userIDKey, userID);
      session.setAttribute(visitCountKey,  visitCount);
   } else {
	   visitCount = (Integer)session.getAttribute(visitCountKey);
	   visitCount += 1;
	   userID = (String)session.getAttribute(userIDKey);
	   session.setAttribute(visitCountKey,  visitCount);
   }
%>
<html>
<head>
<title>Session 跟踪</title>
</head>
<body>

<h1>Session 跟踪</h1>

<table border="1" align="center"> 
<tr bgcolor="#949494">
   <th>Session 信息</th>
   <th>值</th>
</tr> 
<tr>
   <td>id</td>
   <td><% out.print( session.getId()); %></td>
</tr> 
<tr>
   <td>创建时间</td>
   <td><% out.print(createTime); %></td>
</tr> 
<tr>
   <td>最后访问时间</td>
   <td><% out.print(lastAccessTime); %></td>
</tr> 
<tr>
   <td>用户 ID</td>
   <td><% out.print(userID); %></td>
</tr> 
<tr>
   <td>访问次数</td>
   <td><% out.print(visitCount); %></td>
</tr> 
</table> 
</body>
</html>

Cuba akses http://localhost:8080/testjsp/main.jsp, dan anda akan mendapat hasil berikut apabila anda menjalankannya buat kali pertama:

sessjsp1.jpg

Apabila anda melawat semula, anda akan mendapat hasil berikut:

sessjsp2.jpg


Padam data Sesi

Apabila data sesi pengguna diproses Akhirnya, anda boleh mempunyai pilihan berikut:

  • Alih keluar atribut tertentu:

    Panggil kaedah public void removeAttribute(String name) untuk mengalih keluar atribut yang ditentukan.

  • Padamkan keseluruhan sesi:

    Panggil kaedah public void invalidate() untuk membatalkan keseluruhan sesi.

  • Tetapkan tempoh sah sesi:

    Panggil kaedah public void setMaxInactiveInterval(int interval) untuk menetapkan tamat masa sesi.

  • Pengguna Log Keluar:

    Untuk pelayan yang menyokong versi servlet2.4, anda boleh memanggil kaedah logout() untuk log keluar pengguna dan membatalkan semua sesi yang berkaitan.

  • Konfigurasikan fail web.xml:

    Jika anda menggunakan Tomcat, anda boleh mengkonfigurasi fail web.xml seperti berikut:

  <session-config>
    <session-timeout>15</session-timeout>
  </session-config>

Tamat masa dalam minit, Tamat masa lalai dalam Tomcat ialah 30 minit.

Kaedah getMaxInactiveInterval() dalam Servlet mengembalikan tamat masa dalam beberapa saat. Jika 15 minit dikonfigurasikan dalam web.xml, kaedah getMaxInactiveInterval() akan mengembalikan 900.