Thứ Năm, 27 tháng 10, 2016

Session Tracking(Cookie, HttpSession, URLRewritting)

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.
Sau đây là 3 cách để duy trì session giữa Web Client và Web Server:

Sử dụng Cookie

Cookie là một phần thông nhỏ được gửi bởi servlet đến 1 trình duyệt
-Được lưu bởi trình duyệt, sau đó gửi lại cho server trong các requests về sau
     +Một cookie có tên, một giá trị đơn, và các thuộc tính tùy chọn
     +Một giá trị của cookie có thể định danh duy nhất 1 client
 -Server sử dụng giá trị của cookie để trích xuất thông tin về session lưu trên server
Ưu điểm:

- Dễ cài đặt
    +Tùy biến linh động
    +Được duy trì cho đến khi đóng trình duyệt
- Nhược điểm:
    + User có thể tắt cookies để đảm bảo security cho họ
    + Không được hỗ trợ bởi tất cả các trình duyệt

Sử dụng các trường Hidden Form

Một Webserver có thể gửi một trường Hidden Form cùng với một Session ID duy nhất như sau:
<input type="hidden" name="sessionid" value="12345">
Entry này nghĩa là, khi Form này được đệ trình, tên và giá trị đã cho tự động được bao trong 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 để lần theo dấu của các trình duyệt web khác nhau.
Đây có thể là một cách hiệu quả để lần theo dấu của Session nhưng việc click trên một Hypertext Link (ví dụ dạng <A HREF...>) không tạo ra một sự đệ trình Form, vì thế các trường Hidden Form này cũng không thể hỗ trợ việc theo dấu các Gerneral Session.
*Ưu điểm:
- Được hỗ trợ rộng rãi
- Làm việc được với user vô danh
* Nhược điểm:
- Chỉ làm việc được với các form sinh tự động
- Không làm việc được với document tĩnh
- Không xử lý được trường hợp đóng trình duyệt

Viết lại URLRewritting

-URLs được viết lại, hoặc được mã hóa để đưa thêm các thông tin về session
- URL rewriting thường bao gồm một session id
- Session id có thể được gửi như một tham số
* Ưu điểm:
- Làm việc được với user vô danh 
- Được hỗ trợ rộng rãi
* Nhược điểm:
- Phải viết lại tất cả các URLs
- Chỉ làm việc với các documents được tạo động

HttpSession

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.
Bạn sẽ nhận đối tượng HttpSession bằng việc gọi phương thức public là getSession() của HttpServletRequest như sau:
HttpSession session = request.getSession();
Bạn cần gọi phương thức request.getSession() trước khi bạn gửi bất kỳ nội dung tài liệu nào tới Client. Bảng dưới đây liệt kê một số phương thức quan trọng mà có sẵn với đối tượng HttpSession.
STTPhươ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

Ví dụ về Session Tracking trong Servlet

Ví dụ này miêu tả cách sử dụng đối tượng HttpSession để tìm thời gian creation và thời gian last-accessed cho một Session. Chúng ta sẽ liên kết một Session mới với yêu cầu này nếu 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>");
  }
}

Không có nhận xét nào:

Đăng nhận xét