如何在 Java Web 应用程序中使用 Cookie

在本教程中,您将学习如何在 Java Web 应用程序中创建、更新、读取和删除 cookie。

cookie 是存储在 Web 浏览器中并通过 HTTP 标头在请求和响应之间传输的少量数据。cookie 具有名称和值,以及选项属性,如评论、路径、域、最大年龄…… cookie 通常用于在客户端实现简单的临时数据存储,例如会话管理、记住密码、购物车项目、等等。

在 Java Servlet API 中,javax.servlet.http。Cookie 类代表一个 cookie。

表中的内容:

1. 如何创建cookie
2. 如何读取cookie
3. 如何更新cookie
4. 如何删除cookie
5. Java cookie 示例项目

1.如何创建cookie

要在 Web 浏览器中存储 cookie,首先创建一个新的Cookie对象:

1
2
3
String name = "Cookie name";
String value = "Cookie value";
Cookie cookie = new Cookie(name, value);

然后在 Servlet 类中调用HttpServletResponse对象的addCookie()方法,如下所示:

1
response.addCookie(cookie);

这将向客户端发送适当的 HTTP 标头,并且浏览器将 cookie 存储在用户的计算机上。

除了强制属性名称和值之外,您还可以使用以下方法为 cookie 指定附加信息:

setComment (String) : 指定描述 cookie 用途的注释。例如:

1
cookie.setComment("This cookie stores username of the customer");

 setDomain (String) : 指定此 cookie 在其中可见的域名。默认情况下,cookie 只返回给发送它们的服务器。所以设置域名使得cookies可以在同一个域名下的不同服务器上使用。例如:

1
cookie.setDomain(".codejava.net");

此 cookie 将可用于域 codejava.net 下的所有服务器。请注意,域名应以点开头。以下示例将 cookie 的域设置为 localhost:

1
cookie.setDomain("localhost");

 setHttpOnly (boolean) : 如果设置为true,Javascript在客户端无法读取这个cookie,可以防止一些跨站脚本攻击。例如:

1
cookie.setHttpOnly(true);

 setMaxAge (int) : 指定 cookie 在用户计算机中存储的时间,以秒为单位。如果未设置,则在 Web 浏览器退出时删除 cookie。例如:

1
cookie.setMaxAge(7 24 60 60);

这将 cookie 的寿命设置为 7 天(= 24 小时 x 60 分钟 x 60 秒),并且当浏览器存在时它仍存储在用户的计算机上。

setPath (String):如果您想限制 cookie 可用于服务器上的某个路径(及其子路径),请使用此方法。例如:

1
cookie.setPath("/product");

 setSecure (boolean) : 如果设置为 true,cookie 仅在使用安全协议(HTTPS 或 SSL)时从浏览器发送到服务器。默认为假。


2.如何读取cookies

要读取从浏览器发送到服务器的 cookie,请在 Java servlet 类中的HttpServletRequest对象上调用getCookies()方法。此方法返回对当前请求可见的Cookie对象数组。例如,以下代码读取所有 cookie 并打印其名称和值:

1
2
3
4
5
6
7
8
9
10
Cookie[] cookies = request.getCookies();
 
PrintWriter writer = response.getWriter();
 
for (Cookie aCookie : cookies) {
    String name = aCookie.getName();
    String value = aCookie.getValue();
 
    writer.println(name + " = " + value);
}

这意味着如果您想读取特定的 cookie,您需要在循环中检查 cookie 的名称。例如:

1
2
3
4
5
6
7
8
9
10
11
12
String username = null;
 
for (Cookie aCookie : cookies) {
    String name = aCookie.getName();
 
    if (name.equals("username")) {
        username = aCookie.getValue();
         
        break;
    }
     
}

如您所见,此代码片段读取名为“用户名”的 cookie 的值。


3. 如何更新 cookie

要更新现有 cookie,您需要创建一个具有相同名称的新 cookie 并将其添加到响应中。例如:

1
2
3
4
5
6
String name = "Cookie name";
String value = "New value";
 
Cookie cookie = new Cookie(name, value);
 
response.addCookie(cookie);

这将覆盖(更新)具有相同名称的 cookie。


4.如何删除cookie

要从浏览器的缓存中删除 cookie,您需要创建一个具有相同名称的新 cookie,将其最大年龄设置为零并将其添加到响应中。例如:

1
2
3
Cookie cookie = new Cookie("username""");
cookie.setMaxAge(0);
response.addCookie(cookie);

此代码从浏览器中删除名为“用户名”的 cookie。 


5. Java Cookies 示例项目

以下示例项目可帮助您了解如何在 Java Web 应用程序中使用 cookie。创建一个简单的 Java Web 项目。将主页 ( index.jsp ) 编码如下:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
	pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Java Cookies Example</title>
</head>
<body>
	<div align="center">
		<h1>Java Cookies Example</h1>

		<h2>
			<a href="add_cookies">Add Cookies</a>
		</h2>
		<h2>
			<a href="read_cookies">Read Cookies</a>
		</h2>
		<h2>
			<a href="delete_cookies">Delete Cookies</a>
		</h2>

	</div>
</body>
</html>

此页面显示 3 个超链接来测试创建、读取和删除 cookie:

创建AddCookiesServlet 类以使用以下代码处理超链接“添加 Cookie”:


import java.io.IOException;
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;

@WebServlet("/add_cookies")
public class AddCookiesServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private static int cookieCount;

	public AddCookiesServlet() {
	}

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		String name = "Cookie" + (++cookieCount);
		String value = String.valueOf(System.currentTimeMillis());
		Cookie cookie = new Cookie(name, value);

		response.addCookie(cookie);

		response.getWriter().println("A cookie has been created successfully!");

	}

}

每次单击“添加 Cookie”链接时,都会创建一个新的 cookie 并将其发送到浏览器。

 使用以下代码创建ReadCookiesServlet 类以读取应用程序可见的所有 cookie:


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;

@WebServlet("/read_cookies")
public class ReadCookiesServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	public ReadCookiesServlet() {
	}

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		PrintWriter writer = response.getWriter();

		Cookie[] cookies = request.getCookies();

		if (cookies == null) {
			writer.println("No cookies found");
		} else {
			writer.println("Number of cookies: " + cookies.length);

			for (Cookie aCookie : cookies) {
				String name = aCookie.getName();
				String value = aCookie.getValue();

				writer.println(name + " = " + value);
			}
		}
	}

}

单击链接“Read Cookies”将在浏览器中给出以下输出:

如您所见,第一个名为JSESSIONID 的 cookie是由服务器创建的,用于管理用户的会话。

要测试 cookie 的删除,请使用以下代码创建DeleteCookiesServlet类:


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;

@WebServlet("/delete_cookies")
public class DeleteCookiesServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	public DeleteCookiesServlet() {
	}

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		PrintWriter writer = response.getWriter();

		Cookie[] cookies = request.getCookies();

		if (cookies != null) {
			for (Cookie aCookie : cookies) {
				aCookie.setMaxAge(0);
				response.addCookie(aCookie);
			}

			writer.println("All cookies have been deleted!");
		} else {
			writer.println("No cookies found");
		}

	}

}

了解更多:

使用cookies实现记住密码功能

 API 参考:

Cookie 类 Javadoc

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值