Latest web development tutorials

Servlet Sesi Pelacakan

HTTP adalah "stateless" protokol, yang berarti bahwa setiap kali klien mengambil halaman, klien membuka koneksi terpisah ke server Web, server tidak secara otomatis merekam sebelum permintaan klien dilindungi.

Namun masih ada tiga cara untuk mempertahankan sesi percakapan antara klien Web dan server Web:

cookies

Sebuah server Web dapat diberi ID sesi yang unik sebagai sesi untuk setiap klien kue Web, permintaan berikutnya untuk klien dapat digunakan untuk mengidentifikasi cookie diterima.

Ini mungkin tidak menjadi metode yang efektif, karena banyak browser tidak mendukung kuki, jadi kami tidak menyarankan menggunakan cara ini untuk menjaga sesi sesi.

kolom formulir tersembunyi

Sebuah server Web dapat mengirim kolom formulir HTML tersembunyi, serta ID sesi sesi yang unik, sebagai berikut:

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

Catatan ini berarti bahwa ketika formulir dikirimkan, nama dan nilai yang ditentukan akan secara otomatis dimasukkan dalam GET atau POST data. Setiap saat ketika browser Web mengirimkan kembali permintaan, nilai session_id dapat digunakan untuk menjaga berbeda pelacakan Web browser.

Ini mungkin cara yang efektif untuk menjaga pelacakan sesi sesi, tapi klik pada hypertext link yang konvensional (<A HREF...>) tidak menyebabkan pengiriman formulir, sehingga kolom formulir tersembunyi tidak mendukung teratur pelacakan sesi sesi.

Menulis ulang URL

Anda dapat menambahkan beberapa data tambahan pada setiap akhir URL untuk mengidentifikasi sesi sesi sesi sesi identifier dan data yang tersimpan sesi tentang sesi terkait Server akan.

Sebagai contoh, http: //w3cschool.cc/file.htm; sessionid = 12345, sesi sesi identifier dilampirkan sebagai sessionid = 12345, sebuah identifier dapat diakses server Web untuk mengidentifikasi klien.

URL menulis ulang adalah cara yang lebih baik untuk mempertahankan sesi sesi, dapat bekerja sangat baik ketika browser tidak mendukung cookie, namun kelemahan yang dihasilkan secara dinamis untuk setiap URL untuk menetapkan ID sesi untuk halaman sesi, bahkan jika sangat sederhana halaman HTML statis akan juga.

objek HttpSession

Selain di atas tiga cara, Servlet juga menyediakan antarmuka HttpSession, yang menyediakan pengguna untuk mengidentifikasi dan menyimpan informasi tentang pengguna ketika permintaan lebih dari satu halaman lintas atau kunjungi cara.

kontainer servlet untuk menggunakan antarmuka ini untuk membuat percakapan sesi antara klien HTTP dan server HTTP. Sesi berlangsung periode waktu tertentu, di permintaan halaman beberapa atau koneksi.

Anda akan datang untuk mendapatkan HttpSession objek dengan memanggil HttpServletRequest metode UmumgetSession (), sebagai berikut:

HttpSession sesi = request.getSession ();

Anda perlu sebelum mengirim konten dokumen ke klien panggilanrequest.getSession ().Berikut adalah ringkasan dari beberapa metode penting HttpSession objek yang tersedia:

序号方法 & 描述
1public Object getAttribute(String name)
该方法返回在该 session 会话中具有指定名称的对象,如果没有指定名称的对象,则返回 null。
2public Enumeration getAttributeNames()
该方法返回 String 对象的枚举,String 对象包含所有绑定到该 session 会话的对象的名称。
3public long getCreationTime()
该方法返回该 session 会话被创建的时间,自格林尼治标准时间 1970 年 1 月 1 日午夜算起,以毫秒为单位。
4public String getId()
该方法返回一个包含分配给该 session 会话的唯一标识符的字符串。
5public long getLastAccessedTime()
该方法返回客户端最后一次发送与该 session 会话相关的请求的时间自格林尼治标准时间 1970 年 1 月 1 日午夜算起,以毫秒为单位。
6public int getMaxInactiveInterval()
该方法返回 Servlet 容器在客户端访问时保持 session 会话打开的最大时间间隔,以秒为单位。
7public void invalidate()
该方法指示该 session 会话无效,并解除绑定到它上面的任何对象。
8public boolean isNew()
如果客户端还不知道该 session 会话,或者如果客户选择不参入该 session 会话,则该方法返回 true。
9public void removeAttribute(String name)
该方法将从该 session 会话移除指定名称的对象。
10public void setAttribute(String name, Object value)
该方法使用指定的名称绑定一个对象到该 session 会话。
11public void setMaxInactiveInterval(int interval)
该方法在 Servlet 容器指示该 session 会话无效之前,指定客户端请求之间的时间,以秒为单位。

Contoh sesi Tracking

Contoh ini menunjukkan bagaimana menggunakan objek HttpSession untuk mendapatkan sesi sesi waktu penciptaan dan waktu akses terakhir. Jika tidak ada sesi sesi, kami akan membuat sesi baru dengan permintaan sesi.

package com.w3big.test;

import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class SessionTrack
 */
@WebServlet("/SessionTrack")
public class SessionTrack extends HttpServlet {
	private static final long serialVersionUID = 1L;

	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());
		 
	    //设置日期输出的格式  
	    SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
	
		String title = "Servlet Session 实例 - 本教程";
		Integer visitCount = new Integer(0);
		String visitCountKey = new String("visitCount");
		String userIDKey = new String("userID");
		String userID = new String("w3big");
	
		// 检查网页上是否有新的访问者
		if (session.isNew()){
			title = "Servlet Session 实例 - 本教程";
		 	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;charset=UTF-8");
		PrintWriter out = response.getWriter();
	
		String docType = "<!DOCTYPE html>\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>创建时间</td>\n" +
		        "  <td>" +  df.format(createTime) + 
		        "  </td></tr>\n" +
		        "<tr>\n" +
		        "  <td>最后访问时间</td>\n" +
		        "  <td>" + df.format(lastAccessTime) + 
		        "  </td></tr>\n" +
		        "<tr>\n" +
		        "  <td>用户 ID</td>\n" +
		        "  <td>" + userID + 
		        "  </td></tr>\n" +
		        "<tr>\n" +
		        "  <td>访问统计:</td>\n" +
		        "  <td>" + visitCount + "</td></tr>\n" +
		        "</table>\n" +
		        "</body></html>"); 
	}
}

Mengkompilasi sebelumnyaServlet SessionTrack, dan membuat entri yang sesuai di file web.xml.

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
  <servlet> 
    <!-- 类名 -->  
    <servlet-name>SessionTrack</servlet-name>
    <!-- 所在的包 -->
    <servlet-class>com.w3big.test.SessionTrack</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>SessionTrack</servlet-name>
    <!-- 访问的网址 -->
    <url-pattern>/TomcatTest/SessionTrack</url-pattern>
  </servlet-mapping>
</web-app>

Di address bar browser, masukkanhttp: // localhost: 8080 / TomcatTest/ SessionTrack, ketika Anda pertama kali menjalankan pertunjukan hasil sebagai berikut:

Cobalah untuk menjalankan Servlet yang sama lagi, ia akan menampilkan hasil sebagai berikut:


Hapus Sesi sesi Data

Bila Anda telah selesai data sesi sesi pengguna, Anda memiliki pilihan berikut:

  • Hapus atribut tertentu: Anda dapat memanggil metodepublic void removeAttribute (String nama)untuk menghapus nilai tertentu yang terkait dengan kunci.
  • Menghapus seluruh sesi sesi: Anda dapat memanggil metodepublic void invalidate ()untuk membuang seluruh sesi sesi.
  • Sesi mengatur sesi waktu berakhirnya: Anda dapat memanggil metodepublic void setMaxInactiveInterval (int interval)untuk mengatur batas waktu sesi sesi yang terpisah.
  • Keluar Pengguna: Jika Andamenggunakan didukung servlet 2.4 server, Anda dapat menghubungilogoutuntuk logout client server Web, dan semua pengguna milik semua sesi sesi sebagai tidak valid.
  • konfigurasi web.xml: Jika Anda menggunakan Tomcat, selain metode di atas, Anda dapat mengkonfigurasi batas waktu sesi sesi dalam file web.xml, sebagai berikut:
  <session-config>
    <session-timeout>15</session-timeout>
  </session-config>

Contoh waktu di atas-out adalah menit, Tomcat akan mengganti default 30 menit timeout.

getMaxInactiveInterval dalam Servlet dalam metode () mengembalikan sesi sesi timeout, dalam hitungan detik. Jadi, jika dikonfigurasi batas waktu sesi dalam waktu sesi web.xml dari 15 menit, maka getMaxInactiveInterval () akan kembali 900.