Servlet Cookies

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

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

默認情況下,每個請求都被視為新的請求。在cookie技術中,servlet回應可以添加cookie。 所以cookie存儲在流覽器的緩存中。之後,如果用戶發出請求,默認情況下會帶上cookie。 因此,我們就可以知道用戶舊用戶。

Servlet中有2種類型的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 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

下麵來看看簡單的代碼用來獲取所有的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
}

在這個例子中,我們將用戶名稱(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.zaixian;

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.zaixian;

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.zaixian.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.zaixian.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值如下 -


上一篇: Servlet會話跟蹤 下一篇: Servlet登錄註銷Cookies實例