Servlets - Xử lý cookie

Cookie là các tệp văn bản được lưu trữ trên máy khách và chúng được lưu giữ cho các mục đích theo dõi thông tin khác nhau. Java Servlets hỗ trợ rõ ràng cookie HTTP.

Có ba bước liên quan đến việc xác định người dùng cũ -

  • Tập lệnh máy chủ gửi một tập hợp các cookie đến trình duyệt. Ví dụ: tên, tuổi hoặc số nhận dạng, v.v.

  • Trình duyệt lưu trữ thông tin này trên máy cục bộ để sử dụng trong tương lai.

  • Khi lần sau, trình duyệt gửi bất kỳ yêu cầu nào đến máy chủ web thì nó sẽ gửi thông tin cookie đó đến máy chủ và máy chủ sử dụng thông tin đó để xác định người dùng.

Chương này sẽ hướng dẫn bạn cách đặt hoặc đặt lại cookie, cách truy cập và cách xóa chúng.

Giải phẫu của một cookie

Cookie thường được đặt trong tiêu đề HTTP (mặc dù JavaScript cũng có thể đặt cookie trực tiếp trên trình duyệt). Servlet đặt cookie có thể gửi các tiêu đề trông giống như thế này -

HTTP/1.1 200 OK
Date: Fri, 04 Feb 2000 21:03:38 GMT
Server: Apache/1.3.9 (UNIX) PHP/4.0b3
Set-Cookie: name = xyz; expires = Friday, 04-Feb-07 22:03:38 GMT; 
   path = /; domain = tutorialspoint.com
Connection: close
Content-Type: text/html

Như bạn có thể thấy, tiêu đề Set-Cookie chứa một cặp giá trị tên, ngày GMT, đường dẫn và miền. Tên và giá trị sẽ được mã hóa URL. Trường hết hạn là một hướng dẫn để trình duyệt "quên" cookie sau thời gian và ngày nhất định.

Nếu trình duyệt được định cấu hình để lưu trữ cookie, thì trình duyệt sẽ giữ thông tin này cho đến ngày hết hạn. Nếu người dùng trỏ trình duyệt đến bất kỳ trang nào phù hợp với đường dẫn và miền của cookie, nó sẽ gửi lại cookie đến máy chủ. Tiêu đề của trình duyệt có thể trông giống như thế này -

GET / HTTP/1.0
Connection: Keep-Alive
User-Agent: Mozilla/4.6 (X11; I; Linux 2.2.6-15apmac ppc)
Host: zink.demon.co.uk:1126
Accept: image/gif, */*
Accept-Encoding: gzip
Accept-Language: en
Accept-Charset: iso-8859-1,*,utf-8
Cookie: name = xyz

Sau đó, một servlet sẽ có quyền truy cập vào cookie thông qua phương thức yêu cầu request.getCookies () trả về một mảng các đối tượng Cookie .

Phương thức cookie Servlet

Sau đây là danh sách các phương pháp hữu ích mà bạn có thể sử dụng khi thao tác với cookie trong servlet.

Sr.No. Phương pháp & Mô tả
1

public void setDomain(String pattern)

Phương pháp này đặt tên miền áp dụng cookie, ví dụ như tutorialspoint.com.

2

public String getDomain()

Phương pháp này nhận miền áp dụng cookie, ví dụ như tutorialspoint.com.

3

public void setMaxAge(int expiry)

Phương pháp này đặt thời gian (tính bằng giây) sẽ trôi qua trước khi cookie hết hạn. Nếu bạn không đặt điều này, cookie sẽ chỉ tồn tại trong phiên hiện tại.

4

public int getMaxAge()

Phương thức này trả về tuổi tối đa của cookie, được chỉ định bằng giây, Theo mặc định, -1 cho biết cookie sẽ tồn tại cho đến khi trình duyệt tắt.

5

public String getName()

Phương thức này trả về tên của cookie. Không thể thay đổi tên sau khi tạo.

6

public void setValue(String newValue)

Phương pháp này đặt giá trị được liên kết với cookie

7

public String getValue()

Phương thức này nhận giá trị được liên kết với cookie.

số 8

public void setPath(String uri)

Phương pháp này đặt đường dẫn mà cookie này áp dụng. Nếu bạn không chỉ định một đường dẫn, cookie sẽ được trả về cho tất cả các URL trong cùng một thư mục với trang hiện tại cũng như tất cả các thư mục con.

9

public String getPath()

Phương thức này lấy đường dẫn mà cookie này áp dụng.

10

public void setSecure(boolean flag)

Phương thức này đặt giá trị boolean cho biết liệu cookie chỉ nên được gửi qua các kết nối được mã hóa (tức là SSL).

11

public void setComment(String purpose)

Phương thức này chỉ định một nhận xét mô tả mục đích của cookie. Nhận xét hữu ích nếu trình duyệt hiển thị cookie cho người dùng.

12

public String getComment()

Phương thức này trả về bình luận mô tả mục đích của cookie này hoặc vô hiệu nếu cookie không có bình luận.

Cài đặt Cookie bằng Servlet

Đặt cookie với servlet bao gồm ba bước:

(1) Creating a Cookie object - Bạn gọi hàm tạo Cookie bằng tên cookie và giá trị cookie, cả hai đều là chuỗi.

Cookie cookie = new Cookie("key","value");

Xin lưu ý rằng tên và giá trị không được chứa khoảng trắng hoặc bất kỳ ký tự nào sau đây -

[ ] ( ) = , " / ? @ : ;

(2) Setting the maximum age- Bạn sử dụng setMaxAge để chỉ định thời gian (tính bằng giây) cookie sẽ hợp lệ. Sau đây sẽ thiết lập một cookie trong 24 giờ.

cookie.setMaxAge(60 * 60 * 24);

(3) Sending the Cookie into the HTTP response headers - Bạn sử dụng response.addCookie để thêm cookie trong tiêu đề phản hồi HTTP như sau:

response.addCookie(cookie);

Thí dụ

Hãy để chúng tôi sửa đổi Ví dụ về Biểu mẫu của chúng tôi để đặt cookie cho họ và tên.

// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
 
// Extend HttpServlet class
public class HelloForm extends HttpServlet {

   public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
      
      // Create cookies for first and last names.      
      Cookie firstName = new Cookie("first_name", request.getParameter("first_name"));
      Cookie lastName = new Cookie("last_name", request.getParameter("last_name"));

      // Set expiry date after 24 Hrs for both the cookies.
      firstName.setMaxAge(60*60*24);
      lastName.setMaxAge(60*60*24);

      // Add both the cookies in the response header.
      response.addCookie( firstName );
      response.addCookie( lastName );

      // Set response content type
      response.setContentType("text/html");
 
      PrintWriter out = response.getWriter();
      String title = "Setting Cookies Example";
      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" +
               "<ul>\n" +
                  "  <li><b>First Name</b>: "
                  + request.getParameter("first_name") + "\n" +
                  "  <li><b>Last Name</b>: "
                  + request.getParameter("last_name") + "\n" +
               "</ul>\n" +
            "</body>
         </html>"
      );
   }
}

Biên dịch servlet trên HelloForm và tạo mục nhập thích hợp trong tệp web.xml và cuối cùng thử làm theo trang HTML để gọi servlet.

<html>
   <body>
      <form action = "HelloForm" method = "GET">
         First Name: <input type = "text" name = "first_name">
         <br />
         Last Name: <input type = "text" name = "last_name" />
         <input type = "submit" value = "Submit" />
      </form>
   </body>
</html>

Giữ nội dung HTML ở trên trong tệp Hello.htm và đặt nó vào thư mục <Tomcat-installationdirectory> / webapps / ROOT. Khi bạn truy cập http: // localhost: 8080 / Hello.htm , đây là kết quả thực của biểu mẫu trên.

Cố gắng nhập Tên và Họ rồi nhấp vào nút gửi. Điều này sẽ hiển thị tên và họ trên màn hình của bạn và đồng thời nó sẽ đặt hai cookie firstName và lastName sẽ được chuyển trở lại máy chủ khi lần sau bạn nhấn nút Gửi.

Phần tiếp theo sẽ giải thích cho bạn cách bạn truy cập lại các cookie này trong ứng dụng web của mình.

Đọc Cookies với Servlet

Để đọc cookie, bạn cần tạo một mảng các đối tượng javax.servlet.http.Cookie bằng cách gọigetCookies()phương thức của HttpServletRequest . Sau đó, xoay vòng qua mảng và sử dụng các phương thức getName () và getValue () để truy cập từng cookie và giá trị được liên kết.

Thí dụ

Hãy để chúng tôi đọc cookie mà chúng tôi đã đặt trong ví dụ trước -

// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
 
// Extend HttpServlet class
public class ReadCookies extends HttpServlet {
 
   public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
      
      Cookie cookie = null;
      Cookie[] cookies = null;

      // Get an array of Cookies associated with this domain
      cookies = request.getCookies();

      // Set response content type
      response.setContentType("text/html");

      PrintWriter out = response.getWriter();
      String title = "Reading Cookies Example";
      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" );

      if( cookies != null ) {
         out.println("<h2> Found Cookies Name and Value</h2>");

         for (int i = 0; i < cookies.length; i++) {
            cookie = cookies[i];
            out.print("Name : " + cookie.getName( ) + ",  ");
            out.print("Value: " + cookie.getValue( ) + " <br/>");
         }
      } else {
         out.println("<h2>No cookies founds</h2>");
      }
      out.println("</body>");
      out.println("</html>");
   }
}

Biên dịch bên trên servlet ReadCookiesvà tạo mục nhập thích hợp trong tệp web.xml. Nếu bạn đã đặt cookie first_name là "John" và cookie last_name là "Trình phát" thì khi chạy http: // localhost: 8080 / ReadCookies sẽ hiển thị kết quả sau:

Found Cookies Name and Value

Name : first_name, Value: John
Name : last_name, Value: Player

Xóa cookie bằng Servlet

Để xóa cookie rất đơn giản. Nếu bạn muốn xóa một cookie thì bạn chỉ cần thực hiện theo ba bước sau:

  • Đọc một cookie đã có và lưu trữ nó trong đối tượng Cookie.

  • Đặt tuổi cookie bằng 0 bằng cách sử dụng setMaxAge() phương pháp xóa cookie hiện có

  • Thêm lại cookie này vào tiêu đề phản hồi.

Thí dụ

Ví dụ sau sẽ xóa và cookie hiện có có tên "first_name" và khi bạn chạy Servlet ReadCookies vào lần tiếp theo, nó sẽ trả về giá trị null cho first_name.

// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
 
// Extend HttpServlet class
public class DeleteCookies extends HttpServlet {
 
   public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
      
      Cookie cookie = null;
      Cookie[] cookies = null;
         
      // Get an array of Cookies associated with this domain
      cookies = request.getCookies();

      // Set response content type
      response.setContentType("text/html");
 
      PrintWriter out = response.getWriter();
      String title = "Delete Cookies Example";
      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" );
         
      if( cookies != null ) {
         out.println("<h2> Cookies Name and Value</h2>");

         for (int i = 0; i < cookies.length; i++) {
            cookie = cookies[i];

            if((cookie.getName( )).compareTo("first_name") == 0 ) {
               cookie.setMaxAge(0);
               response.addCookie(cookie);
               out.print("Deleted cookie : " + cookie.getName( ) + "<br/>");
            }
            out.print("Name : " + cookie.getName( ) + ",  ");
            out.print("Value: " + cookie.getValue( )+" <br/>");
         }
      } else {
         out.println("<h2>No cookies founds</h2>");
      }
      out.println("</body>");
      out.println("</html>");
   }
}

Biên dịch bên trên servlet DeleteCookiesvà tạo mục nhập thích hợp trong tệp web.xml. Bây giờ chạy http: // localhost: 8080 / DeleteCookies sẽ hiển thị kết quả sau:

Cookies Name and Value

Deleted cookie : first_name

Name : first_name, Value: John

Name : last_name, Value: Player

Bây giờ hãy thử chạy http: // localhost: 8080 / ReadCookies và nó sẽ chỉ hiển thị một cookie như sau:

Found Cookies Name and Value

Name : last_name, Value: Player

Bạn có thể xóa cookie của mình trong Internet Explorer theo cách thủ công. Bắt đầu từ menu Công cụ và chọn Tùy chọn Internet. Để xóa tất cả cookie, hãy nhấn Delete Cookies.