JSP - Theo dõi phiên
Trong chương này, chúng ta sẽ thảo luận về theo dõi phiên trong JSP. 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 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 đó.
Duy trì phiên giữa máy khách và máy chủ
Bây giờ chúng ta hãy thảo luận về một số tùy chọn để duy trì phiên làm việc giữa Máy khách web và Máy chủ web -
Bánh quy
Máy chủ web có thể chỉ định 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à cách hiệu quả vì trình duyệt đôi khi không hỗ trợ cookie. Không 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 GET hoặc là POSTdữ liệu. Mỗi khi trình duyệt web gửi lại yêu cầu,session_id giá trị 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. Dữ liệu này xác định phiên; 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 dưới dạng 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à một cách tốt hơn để duy trì các phiên và hoạt động cho các trình duyệt khi chúng không hỗ trợ cookie. Hạn chế ở đây là bạn sẽ phải tạo động mọi URL để gán ID phiên mặc dù trang là một trang HTML tĩnh đơn giản.
Đối tượng phiên
Ngoài các tùy chọn đã đề cập ở trên, JSP sử dụng giao diện HttpSession được cung cấp bởi servlet. Giao diện này cung cấp một cách để xác định người dùng trên.
- một yêu cầu một trang hoặc
- truy cập vào một trang web hoặc
- lưu trữ thông tin về người dùng đó
Theo mặc định, các JSP đã bật theo dõi phiên và một đối tượng HttpSession mới được khởi tạo tự động cho mỗi máy khách mới. Việc tắt theo dõi phiên yêu cầu tắt rõ ràng bằng cách đặt thuộc tính phiên chỉ thị trang thành false như sau:
<%@ page session = "false" %>
Công cụ JSP hiển thị đối tượng HttpSession với tác giả JSP thông qua sessionvật. Từsession đối tượng đã được cung cấp cho lập trình viên JSP, lập trình viên có thể ngay lập tức bắt đầu lưu trữ và truy xuất dữ liệu từ đối tượng mà không cần khởi tạo hoặc getSession().
Dưới đây là tóm tắt các phương pháp quan trọng có sẵn thông qua đối tượng phiên -
Không. | 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ề lần cuối cùng khách hàng gửi yêu cầu được liên kết với phiên này, dưới dạng số 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, tính bằng giây, vùng chứa servlet sẽ giữ cho phiên này 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.
<%@ page import = "java.io.*,java.util.*" %>
<%
// Get session creation time.
Date createTime = new Date(session.getCreationTime());
// Get last access time of this Webpage.
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 Webpage.
if (session.isNew() ){
title = "Welcome to my website";
session.setAttribute(userIDKey, userID);
session.setAttribute(visitCountKey, visitCount);
}
visitCount = (Integer)session.getAttribute(visitCountKey);
visitCount = visitCount + 1;
userID = (String)session.getAttribute(userIDKey);
session.setAttribute(visitCountKey, visitCount);
%>
<html>
<head>
<title>Session Tracking</title>
</head>
<body>
<center>
<h1>Session Tracking</h1>
</center>
<table border = "1" align = "center">
<tr bgcolor = "#949494">
<th>Session info</th>
<th>Value</th>
</tr>
<tr>
<td>id</td>
<td><% out.print( session.getId()); %></td>
</tr>
<tr>
<td>Creation Time</td>
<td><% out.print(createTime); %></td>
</tr>
<tr>
<td>Time of Last Access</td>
<td><% out.print(lastAccessTime); %></td>
</tr>
<tr>
<td>User ID</td>
<td><% out.print(userID); %></td>
</tr>
<tr>
<td>Number of visits</td>
<td><% out.print(visitCount); %></td>
</tr>
</table>
</body>
</html>
Bây giờ hãy đặt đoạn mã trên vào main.jsp và cố gắng truy cập http://localhost:8080/main.jsp. Sau khi chạy URL, bạn sẽ nhận được kết quả sau:
Chào mừng đến trang web của tôi
Session Information
Thông tin phiên | giá trị |
---|---|
Tôi | 0AE3EC93FF44E3C525B4351B77ABB2D5 |
Thời gian sáng tạo | Thứ Ba, 08 Tháng Sáu 17:26:40 GMT + 04: 00 2010 |
Thời gian truy cập cuối cùng | Thứ Ba, 08 Tháng Sáu 17:26:40 GMT + 04: 00 2010 |
Tên người dùng | A B C D |
Số lượt truy cập | 0 |
Bây giờ hãy thử chạy cùng một JSP lần thứ hai, bạn sẽ nhận được kết quả như sau.
Chào mừng trở lại trang web của tôi
Session Information
loại thông tin | giá trị |
---|---|
Tôi | 0AE3EC93FF44E3C525B4351B77ABB2D5 |
Thời gian sáng tạo | Thứ Ba, 08 Tháng Sáu 17:26:40 GMT + 04: 00 2010 |
Thời gian truy cập cuối cùng | Thứ Ba, 08 Tháng Sáu 17:26:40 GMT + 04: 00 2010 |
Tên người dùng | A B C D |
Số lượt truy cập | 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 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 public void invalidate() để hủy toàn bộ phiên.
Setting Session timeout - Bạn có thể gọi public void setMaxInactiveInterval(int interval) để đặ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ờ của 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.
Cá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.