Cookie là các tập tin văn bản được lưu trữ trên client. Mục đích của cookie là để theo dõi các thông tin khác nhau. Ví dụ trường hợp remember login.
Có ba bước liên quan đến xác định người dùng cũ quay trở lại hệ thống:
- Tập lệnh của 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 vv.
- Trình duyệt lưu trữ thông tin này trên máy local để sử dụng trong tương lai.
- Trong lần truy cập tiếp theo, trình duyệt gửi yêu cầu tới web server, nó sẽ gửi những thông tin cookie tới máy chủ và máy chủ sử dụng thông tin đó để xác định người dùng.
Nội dung chính
Ví dụ về một Cookie
Cookie thường được đặt trong HTTP Header (mặc dù JavaScript cũng có thể đặt cookie trực tiếp trên trình duyệt). Một servlet thiết lập một cookie có thể gửi Header trông giống như:
HTTP/1.1 200 OK Date: Fri, 13 Oct 2017 21:03:38 GMT Server: Apache/1.3.9 (UNIX) PHP/4.0b3 Set-Cookie: name = xyz; expires = Friday, 13-Oct-2017 22:03:38 GMT; path = /; domain = viettuts.vn Connection: close Content-Type: text/html
Như bạn thấy, tiêu đề Set-Cookie chứa một cặp giá trị tên, ngày giờ GMT, đường dẫn và tên miền. Tên và giá trị sẽ được mã hoá theo URL. Trường hết hạn là một chỉ dẫn cho trình duyệt để "quên" cookie sau thời gian và ngày đã chỉ định.
Nếu trình duyệt được cấu hình để lưu trữ các cookie, nó sẽ lưu giữ thông tin này cho đến ngày hết hạn. Nếu người dùng chỉ trình duyệt vào 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ủ. Header của trình duyệt có thể giống như:
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
Một servlet sau đó sẽ có quyền truy cập cookie thông qua yêu cầu của phương thức request.getCookies() trả về một mảng các đối tượng Cookie.
Các phương thức xử lý cookie trong servlet
Dưới đây là danh sách các phương thức hữu ích mà bạn có thể sử dụng trong khi thao tác cookie trong servlet.
No. | Phương thức & Mô tả |
---|---|
1 | public void setDomain(String pattern)
Phương thức này thiết lập tên miền mà cookie áp dụng, ví dụ như tutorialspoint.com. |
2 | public String getDomain()
Phương thức này lấy tên miền mà cookie áp dụng, ví dụ như tutorialspoint.com. |
3 | public void setMaxAge(int expiry)
Phương thức này đặt khoảng thời gian(tính bằng giây) trước khi cookie hết hạn. Nếu bạn không đặt điều này, cookie sẽ chỉ kéo dài cho phiên hiện tại. |
4 | public getMaxAge int()
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 máy. |
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 thức này đặt giá trị kết hợp với cookie |
7 | công getValue String()
Phương thức này lấy giá trị kết hợp với cookie. |
số 8 | public void setPath(String uri)
Phương thức này đặt đường dẫn đến cookie này được áp dụng. Nếu bạn không chỉ định đường dẫn, cookie sẽ được trả về cho tất cả các URL trong cùng thư mục với trang hiện tại cũng như tất cả các thư mục con. |
9 | công getPath String()
Phương thức này là đường dẫn đến cookie này được áp dụng. |
10 | public void setSecure(boolean flag)
Phương thức này thiết lập giá trị boolean cho biết liệu cookie chỉ nên được gửi qua các kết nối được mật mã(tức là SSL). |
11 | public void setComment(String purpose)
Phương thức này xác định một comment mô tả mục đích của một cookie. comment này hữu ích nếu trình duyệt trình bày cookie cho người dùng. |
12 | public String getComment()
Phương thức này trả về comment mô tả mục đích của cookie này, hoặc không hợp lệ nếu cookie không có comment. |
Tạo Cookie trong Servlet
Việc tạo cookie trong servlet bao gồm 3 bước sau:
1. Tạo một đối tượng Cookie: gọi constructor Cookie với các tham số tên và giá trị của cookie, cả hai đều có kiểu là String.
Cookie cookie = new Cookie("key","value");
Hãy ghi nhớ, tên và giá trị không nên chứa khoảng trắng hoặc bất kỳ ký tự nào sau đây:
[ ] ( ) = , " / ? @ : ;
2. Thiết định thời gian tồn tại cho Cookie: sử dụng phương thức setMaxAge() để xác định cookie được sống trong thời gian bao lâu (tính bằng giây). Sau đây sẽ thiết lập một cookie sống trong 24 giờ.
cookie.setMaxAge(60 * 60 * 24);
3. Đính kèm cookie vào HTTP response header: sử dụng phương thức response.addCookie() để thêm các cookie và HTTP response header như sau:
response.addCookie(cookie);
Ví dụ: xử lý tạo cookie trong servlet
Tạo servlet project có tên "ServletCookieExample" 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 CreateCookie để đặt các cookie cho first_name và last_name.
File: CreateCookie.java trong package vn.viettuts
package vn.viettuts; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; //Extend HttpServlet class public class CreateCookie 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>"); } }
Cấu hình file web.xml
<!-- create cookie --> <servlet> <servlet-name>CreateCookie</servlet-name> <servlet-class>vn.viettuts.CreateCookie</servlet-class> </servlet> <servlet-mapping> <servlet-name>CreateCookie</servlet-name> <url-pattern>/CreateCookie</url-pattern> </servlet-mapping>
Tạo file createcookie.html
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Tao Cookie trong Servlet</title> </head> <body> <form action="CreateCookie" method="GET"> First Name: <input type="text" name="first_name"><br> Last Name: <input type="text" name="last_name" /><br> <input type="submit" value="Submit" /> </form> </body> </html>
Phần tiếp theo sẽ giải thích bạn làm thế nào để truy cập vào các cookie này trong ứng dụng web của bạn.
Đọc Cookie trong Servlet
Để đọc cookie, bạn cần phải tạo một mảng các đối tượng javax.servlet.http.Cookie bằng cách gọi phương thức getCookies() của HttpServletRequest. Sau đó duyệt mảng, và sử dụng phương thức getName() và getValue() để truy cập mỗi cookie và giá trị của nó.
Ví dụ: xử lý đọc cookie trong servlet
Chúng tôi đọc cookie mà chúng ta đã đặt trong ví dụ trên
File: ReadCookie.java trong package vn.viettuts
package vn.viettuts; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; //Extend HttpServlet class public class ReadCookie 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>"); } }
Cấu hình file web.xml
<!-- read cookie --> <servlet> <servlet-name>ReadCookie</servlet-name> <servlet-class>vn.viettuts.ReadCookie</servlet-class> </servlet> <servlet-mapping> <servlet-name>ReadCookie</servlet-name> <url-pattern>/ReadCookie</url-pattern> </servlet-mapping>
Xóa Cookie trong 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 làm theo ba bước sau:
- Đọc một cookie hiện có và lưu trữ nó trong đối tượng Cookie.
- Đặt tuổi cookie về 0 bằng cách sử dụng phương thức setMaxAge() để xóa cookie.
- Add cookie trở lại response header.
Ví dụ: xử lý xóa cookie trong servlet
Ví dụ sau sẽ xóa và cookie hiện tại có tên "first_name" và khi bạn chạy lại servlet ReadCookie sẽ trả về giá trị null cho first_name.
package vn.viettuts; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; //Extend HttpServlet class public class DeleteCookie 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) { // delete cookie 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>"); } }
Cấu hình file web.xml
<!-- delete cookie --> <servlet> <servlet-name>DeleteCookie</servlet-name> <servlet-class>vn.viettuts.DeleteCookie</servlet-class> </servlet> <servlet-mapping> <servlet-name>DeleteCookie</servlet-name> <url-pattern>/DeleteCookie</url-pattern> </servlet-mapping>
Cấu trúc project
Sau các bước xử lý ở trên chúng ta được một project trong eclipse với cấu trúc như sau:
Demo ví dụ trên
Tạo cookie bằng link http://localhost:8080/ServletCookieExample/createcookie.html
Sau khi click Submit
Đọc cookie vừa tạo ở trên bằng cách gọi servlet ReadCookie
(URL = http://localhost:8080/ServletCookieExample/ReadCookie)
Xóa cookie có tên "first_name" ở trên bằng cách gọi servlet DeleteCookie
(URL = http://localhost:8080/ServletCookieExample/DeleteCookie )
Đọc lại cookie (URL = http://localhost:8080/ServletCookieExample/ReadCookie), khi đó cookie có tên "first_name" đã bị xóa, chỉ còn cookie "last_name"