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 |
---|---|
1 | Objek awam getAttribute(Nama rentetan) |
2 | Penghitungan awam getAttributeNames() |
3 | public long getCreationTime() |
4 | public String getId() |
5 | public long getLastAccessedTime() |
6 | public int getMaxInactiveInterval() |
7 | kekosongan awam tidak sah() |
8 | public boolean isNew( |
9 | public void removeAttribute(String name) |
10 | public void setAttribute(String name, Object value) |
11 | public void setMaxInactiveInterval(int interval) |
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:
Apabila anda melawat semula, anda akan mendapat hasil berikut:
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.