Servlet Cookies


Cookie是在多個用戶端請求之間持久儲存的一小段資訊。

Cookie具有名稱,單個值和可選屬性,例如注釋,路徑和域限定符,生存週期和版本號。

Cookie工作原理

預設情況下,每個請求都被視為新的請求。在cookie技術中,servlet響應可以新增cookie。 所以cookie儲存在瀏覽器的快取中。之後,如果使用者發出請求,預設情況下會帶上cookie。 因此,我們就可以知道使用者舊使用者。

Cookie型別

Servlet中有2種型別的Cookie。

  • 非永續性cookie
  • 永續性Cookie

非永續性cookie

  • 它僅適用於單個對談。當使用者關閉瀏覽器時都會刪除它。

永續性Cookie

  • 它對多個對談有效。當使用者關閉瀏覽器時也不會刪除它。只有在使用者登出或登出時才被刪除。

Cookie的優點

  • 維持狀態最簡單的技術。
  • Cookie在用戶端維護。

Cookie的缺點

  • 如果從瀏覽器中禁用Cookie,則無法正常工作。
  • 只能在Cookie物件中設定文字資訊。

Cookie類

javax.servlet.http.Cookie類提供了使用Cookie的功能。它為Cookie提供了很多有用的方法。

Cookie類的構造方法

構造方法 描述
Cookie() 構建一個cookie。
Cookie(String name, String value) 構造具有指定名稱和值的cookie。

Cookie類的方法

下面中給出了一些常用的Cookie類方法。

方法 描述
public void setMaxAge(int expiry) 設定cookie的最大生命週期(以秒為單位)。
public String getName() 返回cookie的名稱。建立後無法更改名稱。
public String getValue() 返回cookie的值。
public void setName(String name) 更改cookie的名稱。
public void setValue(String value) 更改cookie的值。

使用Cookies所需的其他方法

要新增cookie或從cookie獲取值,需要其他介面提供的一些方法。它們分別是:

  • public void addCookie(Cookie ck)HttpServletResponse介面的方法用於在響應物件中新增cookie。
  • public Cookie[] getCookies()HttpServletRequest介面的方法用於從瀏覽器返回所有的cookie。

如何建立Cookie?

下面來看看建立cookie的簡單程式碼。

Cookie ck=new Cookie("user","maxsu jaiswal");//creating cookie object  
response.addCookie(ck);//adding cookie in the response

如何刪除Cookie?

下面來看看刪除cookie的簡單程式碼。它主要用於登出或登出使用者。

Cookie ck=new Cookie("user","");//deleting value of cookie  
ck.setMaxAge(0);//changing the maximum age to 0 seconds  
response.addCookie(ck);//adding cookie in the response

如何獲取Cookie?

下面來看看簡單的程式碼用來獲取所有的cookies。

Cookie ck[]=request.getCookies();  
for(int i=0;i<ck.length;i++){  
    out.print("<br>"+ck[i].getName()+" "+ck[i].getValue());//printing name and value of cookie  
}

Servlet Cookie的應用範例

在這個例子中,我們將使用者名稱(username)儲存在cookie物件中,並在另一個servlet中存取它,對談對應於特定使用者。所以如果從多個瀏覽器存取指定cookie名稱,那麼將得到不同的值。

開啟Eclipse,建立一個動態Web專案:CookieServlet,其完整的專案結構如下 -

以下是幾個主要程式碼檔案。

檔案:index.html -

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Cookies In Servlet</title>
</head>
<body>
    <div style="text-align:center;">
        <form action="servlet1" method="post">
            使用者名:<input type="text" name="username" value="Maxsu"/><input
                type="submit" value="提交" />
        </form>
    </div>
</body>
</html>

檔案:FirstServlet.java -

package com.yiibai;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class FirstServlet extends HttpServlet {

    public void doPost(HttpServletRequest request, HttpServletResponse response) {
        try {
            response.setCharacterEncoding("UTF-8");
            response.setContentType("text/html");
            PrintWriter out = response.getWriter();

            String name = request.getParameter("username");
            String username = new String(name.getBytes("ISO-8859-1"),"utf-8");

            out.print("<!DOCTYPE html>\r\n" + 
                    "<html>\r\n" + 
                    "<head>\r\n" + 
                    "<meta charset=\"UTF-8\"><body>");
            out.print("歡迎您, " + username);

            Cookie ck = new Cookie("uname", username);// creating cookie object
            response.addCookie(ck);// adding cookie in the response

            // creating submit button

            out.print("<form action='servlet2' method='post'>");
            out.print("<p>Cookies已在瀏覽器中設定,現在跳轉到第二個Servlet中讀取Cookies的值。</p>");
            out.print("<input type='submit' value='提交到第二個Servlet'>");
            out.print("</form>");

            out.close();

        } catch (Exception e) {
            System.out.println(e);
        }
    }
}

檔案:SecondServlet.java -

package com.yiibai;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class SecondServlet
 */
public class SecondServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
     *      response)
     */
    public void doPost(HttpServletRequest request, HttpServletResponse response) {
        try {
            response.setCharacterEncoding("UTF-8");
            response.setContentType("text/html");
            PrintWriter out = response.getWriter();
            Cookie ck[] = request.getCookies();
            out.print("Hello " + ck[0].getValue());
            out.close();
        } catch (Exception e) {
            System.out.println(e);
        }
    }

}

檔案:web.xml -

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>CookieServlet</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
  </welcome-file-list>
  <servlet>
    <servlet-name>FServlet</servlet-name>
    <servlet-class>com.yiibai.FirstServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>FServlet</servlet-name>
    <url-pattern>/servlet1</url-pattern>
  </servlet-mapping>
  <servlet>
    <servlet-name>SServlet</servlet-name>
    <servlet-class>com.yiibai.SecondServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>SServlet</servlet-name>
    <url-pattern>/servlet2</url-pattern>
  </servlet-mapping>
</web-app>

在完成上面程式碼編寫後,部署這個Web應用程式,開啟瀏覽器存取URL: http://localhost:8080/CookieServlet , 如是程式沒有錯誤,應該會看到以下結果 -

提交後,看到以下介面 -

在第二個Servlet中讀取的Cookies值如下 -