11/08/2018, 18:51

Xử lý Cookie trong Servlet

HTTP Status Codes 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 ...

HTTP Status Codes

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.

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">
";

        out.println(docType + "<html>
" +
                "<head>" + 
                "<title>" + title + "</title>" + 
                "</head>
" +
                "<body bgcolor = "#f0f0f0">
" + 
                "<h1 align = "center">" + title + "</h1>
" +
                "<ul>
" +
                "<li><b>First Name</b>: " + 
                     request.getParameter("first_name") + "
" +
                "<li><b>Last Name</b>: " + 
                     request.getParameter("last_name") + "
" + 
                "</ul>
" +
                "</body>" + "</html>");
    }
}

Cấu hình file web.xml

     
    <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">
";

        out.println(docType + "<html>
" + "<head><title>" + title + 
                "</title></head>
" +
                "<body bgcolor = "#f0f0f0">
");

        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

     
    <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">
";

        out.println(docType + "<html>
" + "<head><title>" + title + 
                "</title></head>
" +
                "<body bgcolor = "#f0f0f0">
");

        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

     
    <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:

Cấu trúc project xử lý cookie trong servlet

Demo ví dụ trên

Tạo cookie bằng link http://localhost:8080/ServletCookieExample/createcookie.html

Xử lý cookie trong servlet

Sau khi click Submit

Xử lý cookie trong servlet

Đọc cookie vừa tạo ở trên bằng cách gọi servlet ReadCookie
(URL = http://localhost:8080/ServletCookieExample/ReadCookie)

Xử lý cookie trong servlet

Xóa cookie có tên “first_name” ở trên bằng cách gọi servlet DeleteCookie
(URL = http://localhost:8080/ServletCookieExample/DeleteCookie )

Xử lý cookie trong servlet

Đọ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”

Xử lý cookie trong servlet

Download project xử lý cookie trong servlet

HTTP Status Codes
0