Servlet Cookies

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

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

Cookie工作原理

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

Servlet

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名稱,那麼將得到不同的值。

Servlet

打開Eclipse,創建一個動態Web項目:CookieServlet,其完整的項目結構如下 -

Servlet

以下是幾個主要代碼文件。

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

提交後,看到以下界面 -

Servlet

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

Servlet