Servlet Session 跟蹤
HTTP 是一種"無狀態"協議,這意味着每次客戶端檢索網頁時,客戶端打開一個單獨的連接到 Web 服務器,服務器會自動不保留之前客戶端請求的任何記錄。
- Servlet 還提供了 HttpSession 接口,該接口提供了一種跨多個頁面請求或訪問網站時識別用戶以及存儲有關用戶信息的方式。
- Servlet 容器使用這個接口來創建一個 HTTP 客戶端和 HTTP 服務器之間的 session會話。會話持續一個指定的時間段,跨多個連接或頁面請求。 通過調用 HttpServletRequest 的公共方法
- getSession() 來獲取 HttpSession 對象
web.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<filter>
<filter-name>logFilter</filter-name>
<filter-class>logFilter</filter-class>
<init-param>
<param-name>site</param-name>
<param-value>zhanghw</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>logFilter</filter-name>
<!--過濾器適用於所有的 Servlet,因爲我們在配置中指定 /*-->
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>helloworld</servlet-name>
<servlet-class>myServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>helloworld</servlet-name>
<url-pattern>/helloworld</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>sessionServlet</servlet-name>
<servlet-class>sessionServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>sessionServlet</servlet-name>
<url-pattern>/helloworld/sessionServlet</url-pattern>
</servlet-mapping>
</web-app>
sessionServlet 類配置
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;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
@WebServlet(name = "sessionServlet")
public class sessionServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected 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("Runoob");
if(session.getAttribute(visitCountKey) == null) {
session.setAttribute(visitCountKey, new Integer(0));
}
// 檢查網頁上是否有新的訪問者
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>");
}
}
測試