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