Servlets - Theo dõi phiên
HTTP là một giao thức "không trạng thái" có nghĩa là mỗi khi máy khách truy xuất một trang Web, máy khách sẽ mở một kết nối riêng đến máy chủ Web và máy chủ tự động không lưu giữ bất kỳ bản ghi nào về yêu cầu của máy khách trước đó.
Vẫn có ba cách sau để duy trì phiên giữa máy khách web và máy chủ web -
Bánh quy
Máy chủ web có thể gán một ID phiên duy nhất làm cookie cho mỗi máy khách web và đối với các yêu cầu tiếp theo từ máy khách, chúng có thể được nhận dạng bằng cách sử dụng cookie đã nhận.
Đây có thể không phải là một cách hiệu quả vì nhiều lúc trình duyệt không hỗ trợ cookie, vì vậy tôi không khuyên bạn nên sử dụng quy trình này để duy trì các phiên.
Trường biểu mẫu ẩn
Máy chủ web có thể gửi trường biểu mẫu HTML ẩn cùng với ID phiên duy nhất như sau:
<input type = "hidden" name = "sessionid" value = "12345">
Mục nhập này có nghĩa là, khi biểu mẫu được gửi, tên và giá trị được chỉ định sẽ tự động được đưa vào dữ liệu GET hoặc POST. Mỗi khi trình duyệt web gửi lại yêu cầu, thì giá trị session_id có thể được sử dụng để theo dõi các trình duyệt web khác nhau.
Đây có thể là một cách hiệu quả để theo dõi phiên nhưng việc nhấp vào liên kết siêu văn bản thông thường (<A HREF...>) không dẫn đến việc gửi biểu mẫu, vì vậy các trường biểu mẫu ẩn cũng không thể hỗ trợ theo dõi phiên chung.
Viết lại URL
Bạn có thể thêm một số dữ liệu bổ sung vào cuối mỗi URL xác định phiên và máy chủ có thể liên kết số nhận dạng phiên đó với dữ liệu mà nó đã lưu trữ về phiên đó.
Ví dụ: với http://tutorialspoint.com/file.htm;sessionid = 12345, mã định danh phiên được đính kèm là sessionid = 12345 có thể được truy cập tại máy chủ web để xác định máy khách.
Viết lại URL là cách tốt hơn để duy trì các phiên và nó hoạt động ngay cả khi trình duyệt không hỗ trợ cookie. Hạn chế của việc ghi lại URL là bạn sẽ phải tạo động mọi URL để gán ID phiên, ngay cả trong trường hợp là một trang HTML tĩnh đơn giản.
Đối tượng HttpSession
Ngoài ba cách đã đề cập ở trên, servlet cung cấp Giao diện HttpSession cung cấp một cách để xác định một người dùng trên nhiều trang yêu cầu hoặc truy cập vào một trang Web và lưu trữ thông tin về người dùng đó.
Vùng chứa servlet sử dụng giao diện này để tạo một phiên giữa máy khách HTTP và máy chủ HTTP. Phiên này vẫn tồn tại trong một khoảng thời gian được chỉ định, qua nhiều kết nối hoặc yêu cầu trang từ người dùng.
Bạn sẽ nhận được đối tượng HttpSession bằng cách gọi phương thức public getSession() của HttpServletRequest, như bên dưới -
HttpSession session = request.getSession();
Bạn cần gọi request.getSession () trước khi gửi bất kỳ nội dung tài liệu nào cho máy khách. Dưới đây là tóm tắt về các phương thức quan trọng có sẵn thông qua đối tượng HttpSession -
Sr.No. | Phương pháp & Mô tả |
---|---|
1 | public Object getAttribute(String name) Phương thức này trả về đối tượng được ràng buộc với tên được chỉ định trong phiên này hoặc null nếu không có đối tượng nào bị ràng buộc dưới tên. |
2 | public Enumeration getAttributeNames() Phương thức này trả về một Danh sách các đối tượng Chuỗi chứa tên của tất cả các đối tượng được liên kết với phiên này. |
3 | public long getCreationTime() Phương thức này trả về thời gian khi phiên này được tạo, được đo bằng mili giây kể từ nửa đêm ngày 1 tháng 1 năm 1970 GMT. |
4 | public String getId() Phương thức này trả về một chuỗi chứa mã định danh duy nhất được gán cho phiên này. |
5 | public long getLastAccessedTime() Phương thức này trả về thời gian được truy cập cuối cùng của phiên, ở định dạng mili giây kể từ nửa đêm ngày 1 tháng 1 năm 1970 GMT |
6 | public int getMaxInactiveInterval() Phương thức này trả về khoảng thời gian tối đa (giây) mà thùng chứa servlet sẽ giữ cho phiên mở giữa các lần truy cập máy khách. |
7 | public void invalidate() Phương thức này làm mất hiệu lực phiên này và hủy liên kết bất kỳ đối tượng nào bị ràng buộc với nó. |
số 8 | public boolean isNew( Phương thức này trả về true nếu máy khách chưa biết về phiên hoặc nếu máy khách chọn không tham gia phiên. |
9 | public void removeAttribute(String name) Phương thức này loại bỏ đối tượng bị ràng buộc với tên được chỉ định khỏi phiên này. |
10 | public void setAttribute(String name, Object value) Phương thức này liên kết một đối tượng với phiên này, sử dụng tên được chỉ định. |
11 | public void setMaxInactiveInterval(int interval) Phương thức này chỉ định thời gian, tính bằng giây, giữa các yêu cầu của khách hàng trước khi vùng chứa servlet sẽ làm mất hiệu lực phiên này. |
Ví dụ về theo dõi phiên
Ví dụ này mô tả cách sử dụng đối tượng HttpSession để tìm ra thời gian tạo và thời gian được truy cập cuối cùng cho một phiên. Chúng tôi sẽ liên kết một phiên mới với yêu cầu nếu một phiên chưa tồn tại.
// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
// Extend HttpServlet class
public class SessionTrack extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Create a session object if it is already not created.
HttpSession session = request.getSession(true);
// Get session creation time.
Date createTime = new Date(session.getCreationTime());
// Get last access time of this web page.
Date lastAccessTime = new Date(session.getLastAccessedTime());
String title = "Welcome Back to my website";
Integer visitCount = new Integer(0);
String visitCountKey = new String("visitCount");
String userIDKey = new String("userID");
String userID = new String("ABCD");
// Check if this is new comer on your web page.
if (session.isNew()) {
title = "Welcome to my website";
session.setAttribute(userIDKey, userID);
} else {
visitCount = (Integer)session.getAttribute(visitCountKey);
visitCount = visitCount + 1;
userID = (String)session.getAttribute(userIDKey);
}
session.setAttribute(visitCountKey, visitCount);
// Set response content type
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 Infomation</h2>\n" +
"<table border = \"1\" align = \"center\">\n" +
"<tr bgcolor = \"#949494\">\n" +
" <th>Session info</th><th>value</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>"
);
}
}
Biên dịch servlet trên SessionTrackvà tạo mục nhập thích hợp trong tệp web.xml. Bây giờ đang chạy http: // localhost: 8080 / SessionTrack sẽ hiển thị kết quả sau khi bạn chạy lần đầu tiên:
Welcome to my website
Session Infomation
Session info
value
id
0AE3EC93FF44E3C525B4351B77ABB2D5
Creation Time
Tue Jun 08 17:26:40 GMT+04:00 2010
Time of Last Access
Tue Jun 08 17:26:40 GMT+04:00 2010
User ID
ABCD
Number of visits
0
Bây giờ hãy thử chạy cùng một servlet lần thứ hai, nó sẽ hiển thị kết quả sau.
Welcome Back to my website
Session Infomation
info type
value
id
0AE3EC93FF44E3C525B4351B77ABB2D5
Creation Time
Tue Jun 08 17:26:40 GMT+04:00 2010
Time of Last Access
Tue Jun 08 17:26:40 GMT+04:00 2010
User ID
ABCD
Number of visits
1
Xóa dữ liệu phiên
Khi bạn hoàn tất dữ liệu phiên của người dùng, bạn có một số tùy chọn -
Remove a particular attribute- Bạn có thể gọi phương thức public void removeAttribute (String name) để xóa giá trị được liên kết với một khóa cụ thể.
Delete the whole session- Bạn có thể gọi phương thức public void validate () để loại bỏ toàn bộ phiên.
Setting Session timeout- Bạn có thể gọi phương thức public void setMaxInactiveInterval (int khoảng) để đặt thời gian chờ cho một phiên riêng lẻ.
Log the user out - Các máy chủ hỗ trợ servlet 2.4, bạn có thể gọi logout để đăng xuất máy khách ra khỏi máy chủ Web và làm mất hiệu lực tất cả các phiên thuộc về tất cả người dùng.
web.xml Configuration - Nếu bạn đang sử dụng Tomcat, ngoài các phương pháp đã đề cập ở trên, bạn có thể cấu hình thời gian chờ phiên trong tệp web.xml như sau.
<session-config>
<session-timeout>15</session-timeout>
</session-config>
Thời gian chờ được biểu thị bằng phút và ghi đè thời gian chờ mặc định là 30 phút trong Tomcat.
Phương thức getMaxInactiveInterval () trong một servlet trả về khoảng thời gian chờ cho phiên đó tính bằng giây. Vì vậy, nếu phiên của bạn được định cấu hình trong web.xml trong 15 phút, getMaxInactiveInterval () trả về 900.