4.1 Giới thiệu về HttpSession

Nếu một số yêu cầu đến từ cùng một máy khách, thì họ nói rằng một phiên đã được thiết lập giữa máy khách và máy chủ. Để kiểm soát quá trình này, vùng chứa có một đối tượng HttpSession đặc biệt.

Khi một khách hàng đưa ra yêu cầu đối với một servlet, bộ chứa servlet sẽ kiểm tra xem liệu tham số ID phiên có xuất hiện trong yêu cầu hay không. Nếu không có tham số như vậy (ví dụ: máy khách đang liên hệ với máy chủ lần đầu tiên), thì bộ chứa servlet sẽ tạo một đối tượng HttpSession mới và cũng gán cho nó một ID duy nhất.

Đối tượng phiên được lưu trữ trên máy chủ và ID được gửi trong phản hồi cho máy khách và theo mặc định được lưu trữ trên máy khách trong cookie. Sau đó, khi một yêu cầu mới đến từ cùng một máy khách, bộ chứa servlet sẽ lấy ID từ nó và ID đó sẽ tìm đúng đối tượng HttpSession trên máy chủ.

Bạn có thể lấy đối tượng phiên từ một yêu cầu (đối tượng HttpServletRequest), trên đó bạn cần gọi phương thức getSession(). Nó trả về một đối tượng HttpSession.

Tại sao một phiên cần thiết? Nó có thể lưu trữ thông tin về khách hàng giữa các cuộc gọi. Cô ấy có một thứ giống như HashMap bên trong, trong đó bạn có thể lưu trữ các đối tượng bằng các phím. Và một số phương pháp cho việc này:

phương pháp Sự miêu tả
1 setAttribute(String name, Object o) Thêm một đối tượng vào phiên
2 getAttribute(String name) Nhận một đối tượng từ phiên
3 removeAttribute(String name) Xóa một đối tượng khỏi phiên

Hãy viết một servlet tổng hợp tất cả các số được truyền cho nó từ các yêu cầu khác nhau:

public class CalculatorServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
         // Get the "sum" attribute from the session
        HttpSession session = request.getSession();
        Integer sum = (Integer) session.getAttribute("sum");
        //Handling the situation when the session does not yet have such an attribute
        if (sum == null)
            sum = 0;

         // Get the "n" parameter from the request
        String n = request.getParameter("n");
        sum += Integer.parseInt(n);

         // Write the "sum" attribute to the session
        session.setAttribute("sum", sum);

        // Print the HTML as a response to the browser
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head> <title> CalculatorServlet </title> </head>");
        out.println("<body>");
        out.println("<h1> Sum == " + sum + "</h1>");
        out.println("</body>");
        out.println("</html>");
    }
}

4.2 Tìm hiểu thêm về HttpSession

Còn điều gì khác mà chúng ta chưa nói về đối tượng HttpSession không?

Đầu tiên, đó là tên J SESSION ID. Theo đó, ID phiên được lưu trữ trong cookie. Như bạn có thể thấy, nó khá dễ nhớ: J+SESSION+ID.

Thứ hai, phiên có một số phương pháp hữu ích hơn:

phương pháp Sự miêu tả
1 getAttributeNames() Trả về danh sách tất cả các khóa được lưu trữ trong phiên
2 getId() Trả về ID phiên (chuỗi)
3 isNew() Trả về true nếu đối tượng phiên được tạo trong yêu cầu hiện tại
4 setMaxInactiveInterval(int seconds) Đặt khoảng thời gian không hoạt động của phiên tính bằng giây
5 invalidate() Xóa tất cả các đối tượng khỏi phiên

Ở đây tất cả các phương pháp đều rõ ràng, nhưng setMaxInactiveInterval()chúng ta sẽ nói thêm một chút.

Nếu máy chủ lưu trữ hàng chục nghìn phiên, bao gồm cả dữ liệu của những khách hàng đã truy cập vào tháng trước, thì nó sẽ hết bộ nhớ. Do đó, có một cách để đặt "thời gian tồn tại của phiên".

Nếu không có ai sử dụng phiên trong một khoảng thời gian, thì nó sẽ tự xóa - tất cả các đối tượng mà nó lưu trữ sẽ bị xóa khỏi nó. Điều này được thực hiện để tiết kiệm bộ nhớ.

Theo mặc định, khoảng thời gian này là 1800 giây == 30 phút. Nếu bạn đặt giá trị thành -1, thì phiên này sẽ là "vĩnh viễn" và sẽ chỉ bị xóa khi người dùng đóng tab trình duyệt (tốt, hoặc máy khách ngắt kết nối).

Ví dụ:

// get all keys
Enumeration keys = session.getAttributeNames();
while( keys.hasMoreElements() ){
    System.out.println( (String) keys.nextElement() );
}
// set the inactivity interval
session.setMaxInactiveInterval(60*60*24);   // 1 day
session.setMaxInactiveInterval(-1); // until the browser is closed
// remove all data from the session
session.invalidate();