HTTP là một giao thức "stateless" nghĩa là mỗi lần client truy xuất một trang Web, client sẽ mở một kết nối riêng đến máy chủ Web và máy chủ sẽ tự động không giữ lại bất kỳ thông tin nào về yêu cầu của client trước đó.
Có ba cách sau để thực hiện theo dõi phiên (session tracking) giữa client và máy chủ web:
Nội dung chính
Sử dụng Cookies
Một máy chủ web có thể chỉ định một session ID duy nhất làm một cookie cho mỗi client và các yêu cầu tiếp theo từ máy khách có thể được phân biệt bằng cách sử dụng cookie đã nhận.
Đây không phải là cách hiệu quả bởi vì nhiều trình duyệt không hỗ trợ cookie, vì vậy bạn nên sử dụng phương pháp này để duy trì các phiên làm việc.
Sử dụng Hidden Fields của HTML From
Một máy chủ web có thể gửi một trường ẩn (Hidden Field) cùng với một session ID duy nhất như sau:
<input type="hidden" name="sessionid" value="1234567890">
Mục nhập này có nghĩa là, khi form được gửi, tên và giá trị được chỉ định sẽ được tự động đưa vào dữ liệu GET hoặc POST. Mỗi khi trình duyệt web gửi yêu cầu trở lại, 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 khi click vào liên kết siêu văn bản (<A HREF...>) thường không dẫn đến việc gửi form, do đó các trường ẩn cũng không thể hỗ trợ theo dõi phiên.
Sử dụng URL Rewriting
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 mã nhận diện phiên với dữ liệu mà nó đã lưu trữ về phiên đó.
Ví dụ: với /test.html?sessionid=1234567890, định danh phiên được đính kèm dưới dạng sessionid = 1234567890, có thể được truy cập tại máy chủ web để xác định client.
Viết lại URL là một cách tốt hơn để duy trì phiên và nó hoạt động ngay cả khi các trình duyệt không hỗ trợ cookie. Hạn chế của việc viết lại URL là bạn sẽ phải tự động tạo ra tất cả các URL để chỉ định một session ID, ngay cả trong trường hợp của một trang HTML tĩnh đơn giản.
Đối tượng HttpSession
Ngoài ba cách nêu trên, servlet cung cấp HttpSession interface cung cấp cách để xác định người dùng ghé thăm trang web và lưu trữ thông tin về người dùng đó.
Servlet container sử dụng interface này để tạo ra một session giữa một máy HTTP client và một HTTP server. Session này có thể tồn tại trong một khoảng thời gian nhất định, trên nhiều yêu cầu kết nối hoặc trang của người dùng.
Tạo đối tượng HttpSession bằng cách gọi phương thức getSession() của HttpServletRequest, như sau:
HttpSession session = request.getSession();
Bạn cần gọi request.getSession() trước khi gửi bất kỳ nội dung nào đến client. Dưới đây là tóm tắt các phương thức quan trọng hiện có của đối tượng HttpSession.
No. | Phương thức & Mô tả |
---|---|
1 | public Object getAttribute(String name)
Phương thức này trả về đối tượng bị ràng buộc với tên được chỉ định trong session 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 Enumeration of String các đối tượng có chứa tên của tất cả các đối tượng ràng buộc vào session này. |
3 | public long getCreationTime()
Phương thức này trả về thời gian khi session này được tạo ra, đượ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 session này. |
5 | public long getLastAccessedTime()
Phương thức này trả về thời gian truy cập cuối cùng của session, theo đị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), rằng vùng chứa servlet sẽ giữ session mở giữa các lần truy cập của client. |
7 | public void invalidate()
Phương thức này làm mất hiệu lực session này và unbinds bất kỳ đối tượng liên quan đến nó. |
số 8 | public boolean isNew()
Phương thức này trả về true nếu client chưa biết về session hoặc nếu client không tham gia session làm việc. |
9 | public void removeAttribute(String name)
Phương thức này loại bỏ các đối tượng bị ràng buộc với tên quy định từ session 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 đến session 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 client trước khi bộ chứa servlet sẽ làm mất hiệu lực session này. |
Ví dụ về Session Tracking trong Servlet
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 truy cập cuối cùng cho một session. Chúng ta sẽ liên kết một session mới với một request nếu session chưa tồn tại.
Tạo servlet project có tên "ServletSessionExample" trên eclipse giống như trong bài hướng dẫn Tạo ứng dụng Servlet trên Eclipse
Tạo servlet SessionTrack.java trong package vn.viettuts có nội dung như sau:
package vn.viettuts; import java.io.IOException; import java.io.PrintWriter; import java.util.Date; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; //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("123456789"); // 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>"); } }
Cấu hình servlet trên trong web.xml
<!-- session tracking --> <servlet> <servlet-name>SessionTrack</servlet-name> <servlet-class>vn.viettuts.SessionTrack</servlet-class> </servlet> <servlet-mapping> <servlet-name>SessionTrack</servlet-name> <url-pattern>/SessionTrack</url-pattern> </servlet-mapping>
Run project
Truy cập vào link http://localhost:8080/ServletSessionExample/SessionTrack
Lần đầu tiên sẽ cho ra kết quả như sau:
Lần tiếp theo sẽ cho ra kết quả như sau:
Xóa Session Data
Bạn có thể xóa session data với các tùy chon nhứ sau:
- Xoá một thuộc tính cụ thể: bạn có thể gọi phương thức public void removeAttribute(String name) để xóa giá trị kết hợp với một khoá cụ thể.
- Xóa toàn bộ sesssion: bạn có thể gọi phương thức public void invalidate() để xóa toàn bộ sesssion.
- Cài đặt thời gian chờ cho session: bạn có thể gọi phương thức public void setMaxInactiveInterval(int interval) để đặt thời gian chờ cho một session riêng.
- Đăng xuất user: các máy chủ hỗ trợ servlet 2.4, bạn đăng xuất khách hàng ra khỏi Web server và làm mất hiệu lực tất cả session của tất cả người dùng.
- Cấu hình web.xml: 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ể thiết định thời gian session trong tệp web.xml như sau:
<session-config> <session-timeout>15</session-timeout> </session-config>
Thời gian chờ được biểu diễn 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 session theo giây. Vì vậy, nếu phiên của bạn được cấu hình trong web.xml trong 15 phút, getMaxInactiveInterval() trả về 900.