Session Tracking(Cookie, HttpSession, URLRewritting)
Session Tracking
- Session tracking hiểu đơn giản là cách để duy trì trạng thái(dữ liệu) của người dùng khi người dùng truy cập vào 1 ứng dụng hay website.
- HTTP là một giao thức Stateless, nghĩa là mỗi khi một Client thu nhận một trang Web, thì Client mở một kết nối riêng rẽ tới Web Server và Server tự động không giữ bất kỳ bản ghi nào của các yêu cầu trước đó từ Client.
Vì vậy chúng ta có Session Tracking:
- Cho phép các ứng dụng Web duy trì thông tin của người dùng với máy chủ miễn là người dùng không đăng xuất khỏi Website.
- Theo dõi các danh tính của khách hàng và thông tin trạng thái khác cần thiết trong suốt session.
Có 3 cách để duy trì session giữa Web Client và Web Server:
- Cookies
- URL rewriting
- HTTP Session
1. Cookie
Cookie là cơ chế default để quản lý session. Session tracking qua cookie là thêm một mẩu thông tin để lưu giữ id của session, id này được lưu trong header của request/response để truyền qua lại giữa client và server và thường có tên (cookie name) là jssseionid (tên này phụ thuộc vào từng container).
- Cách thức hoạt động của cookies
Chúng ta code thử 1 ví dụ về login đơn giản cho các bạn hiểu hơn luôn nhé!
Bước 1: Các bạn tạo 1 java web -> web application và tạo 1 trang jsp có tên là login.jsp và chứa code như sau:
Bước 2: Tạo 1 file servlet trong folder Source Packages có tên là LoginServlet.java và code như sau
Chú ý: Vì ở bước 1 chúng ta đặt method="POST" nên chúng ta sẽ viết code vào phương thức doPost ai mà viết vào doGet là không ra được kết quả mong muốn đâu.
- Ở bước này các bạn có thể thấy mình tạo cookies đơn giản như sau:
Bước 3:Cuối cùng tạo 1 file jsp để kiểm tra xem mình đã tạo và lưu cookies thành công hay chưa. Ở đây mình file jsp của mình có tên là user.jsp
Chạy file login.jsp và tận hưởng thành quả :) (Nhập username và password giống nhau nha!.)
2. URL REWRITING
- URL rewriting là thêm sessionid vào url, phương pháp này có tác dụng khi mà cookie không làm việc (thường do browser disable cookie). Tuy nhiên để sử dụng cách này thì url phải được encode bằng cách:
response.encodeURL(url: String)
response.encodeRedirectURL(url: String): URL Rewriting trong trường hợp redirect
-Hidden fields: Một máy chủ web có thể gửi một trường mẫu HTML ẩn cùng với một session ID duy nhất như sau:
<input type="hidden" name="sessionid" value="12345">
- Mục nhập này có nghĩa là, khi các mẫu được gửi, tên và giá trị xác định được tự động đưa vào GET hoặc POST dữ liệu. Mỗi lần khi duyệt web sẽ gửi yêu cầu trở lại, sau đó giá trị session_id có thể được sử dụng để giữ theo dõi của các trình duyệt web khác nhau.
- Chúng được đặt trong một form HTML.
- Chúng là một phần của biểu mẫu HTML tĩnh hoặc thông tin động tạo ra thông qua servlet.
- Chúng có thể được sử dụng để giữ bất kỳ loại dữ liệu.
- Chúng không thể được nhìn thấy bởi người sử dụng và do đó không được giải thích bởi các trình duyệt.
- User có thể gửi nhiều dữ liệu và mã hóa ký tự.
- Hidden field và Url rewriting rất tốt để cùng sử dụng
Ví dụ
3. HTTP Session
- Ngoài hai cách được đề cập ở trên, Servlet cung cấp HttpSession Interface, cung cấp một cách để nhận diện một người sử dụng mà lướt qua nhiều hơn một yêu cầu trang, hoặc tới một Website và để lưu thông tin về người dùng đó.
- Servlet container sử dụng Interface này để tạo một Session giữa một HTTP Client và một HTTP Server. Session này tồn tại trong một khoảng thời gian đã cho, qua nhiều hơn một kết nối hoặc yêu cầu trang từ người dùng.
- Cách tạo 1 session đơn giản trong servlet:
HttpSession session = request.getSession();
- Thôi làm 1 ví dụ để dễ hiểu hơn nhé.
Tạo 1 servlet và code như sau:
public class SessionTrackingServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(true);
Date createTime = new Date(session.getCreationTime()); Date lastAccessTime = new Date(session.getLastAccessedTime()); String title = "Welcome Back to my website"; int visitCount = 0; String userID= new String("19042205"); String userName = new String("Doubleboo"); if (session.isNew()){ title = "Welcome to my website"; session.setAttribute(userID, userName); } else { visitCount = visitCount + 1; userName = (String)session.getAttribute(userID); }
response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<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\" cellspacing=\"0\" align=\"center\">\n" + "<tr bgcolor=\"#949494\">\n" + " <th>Session info</th><th>value</th></tr>\n" + "<tr>\n" + " <td>Session 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 Name</td>\n" + " <td>" + userName + " </td></tr>\n" + "<tr>\n" + " <td>Number of visits</td>\n" + " <td>" + visitCount + "</td></tr>\n" + "</table>\n" + "</body></html>"); } }
Chạy servlet đó và đây là kết quả!
Các phương thức của đối tượng HttpSession hay dùng.
STT | Phương thức và Miêu tả |
---|---|
1 |
public Object getAttribute(String name)
Phương thức này trả về đối tượng được bind với name đã cho trong Session này, hoặc trả về nul nếu không có đối tượng nào được bind với tên này
|
2 |
public Enumeration getAttributeNames()
Trả về một Enumeration của các đối tượng String chứa các tên của tất cả đối tượng được bind tới Session này
|
3 |
public long getCreationTime()
Trả về thời gian khi Session này được tạo, được tính toán bằng mili giây từ 1/1/1970 GMT
|
4 |
public String getId()
Phương thức này trả về một String chứa Identifier duy nhất được gán tới Session này
|
5 |
public long getLastAccessedTime()
Phương thức này trả về thời gian cuối cùng mà Client gửi một yêu cầu mà liên kết với Session này, với số mili giây từ 1/1/1970
|
6 |
public int getMaxInactiveInterval()
Phương thức này trả về khoảng thời gian tối đa, bằng giây, mà Servlet container sẽ giữ Session này được mở trong các truy cập client
|
7 |
public void invalidate()
Phương thức này vô hiệu hóa session này và không kết nối bất kỳ đối tượng nào được bind với nó
|
8 |
public boolean isNew(
Phương thức này trả về true nếu Client vẫn chưa biết về Session đó
|
9 |
public void removeAttribute(String name)
Phương thức này gỡ bỏ đối tượng được bind với tên đã cho từ session này
|
10 |
public void setAttribute(String name, Object value)
Phương thức này bind một đối tượng tới Session này, bởi sử dụng tên đã cung cấp
|
11 |
public void setMaxInactiveInterval(int interval)
Phương thức này xác định thời gian, bằng giây, giữa các yêu cầu từ Client trước khi Servlet container sẽ vô hiệu hóa session này
|
4. Tổng Kết
Về Cookies:- Khi sử dụng cookies để lưu dữ liệu sẽ gặp phải hạn chế là: đa số người dùng tắt cookies trên trình duyệt vì sợ bị mất, hack , lộ thông tin
Về Hidden fields:
- Chỉ hoạt động khi trang nhận được yêu cầu thông qua một submit form
Còn đối với URL Rewrite
- Ưu điểm
- Có thể được nối khi gửi dữ liệu từ form HTML.
- Có thể được gửi cùng với nội dung động từ một Servlet.
- Là một cách tốt để duy trì phiên khi các trình duyệt không hỗ trợ cookie hoặc người dùng vô hiệu hóa sự hỗ trợ cho các tập tin cookie.
- Nhược điểm
- URL chỉ có thể được gửi thông qua các hyperlink trên trang Web.
- URL dài không thể lưu trữ nhiều thông tin do giới hạn chiều dài URL(255)
- URL có chứa thông tin dữ liệu có thể nhìn thấy, vì vậy nó không phải an toàn
Tài liệu tham khảo:
Session Tracking Tutorial
Session Tracking (Tài liệu tiếng việt)
No comments:
Post a Comment