深入解析浏览器Cookie
- 前言
- 一、什么是 Cookie?
- 二、Cookie的特点
- 二、如何创建 Cookie?
- 三、服务器如何获取 Cookie
- 四、Cookie 值的修改
- 4.1 方案一
- 4.2 方案二
- 五、浏览器查看 Cookie
- 六、Cookie 生命控制
- 七、Cookie 有效路径 Path 的设置
- 八、案例:Cookie 练习---免输入用户名登录
前言
本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注博主!
也许一个人独行,可以走的很快,但是一群人结伴而行,才能走的更远!
一、什么是 Cookie?
- Cookie 翻译过来是饼干的意思。
- Cookie是一种用于在客户端浏览器和服务器之间进行状态跟踪的技术。当用户访问一个网站时,服务器将一小段用于标识用户和跟踪用户访问行为的信息发送到用户的浏览器,浏览器将这些信息存储在用户的计算机上。然后,在用户下次访问该网站时,浏览器会将这些信息发送回服务器,从而实现用户的状态跟踪。
- Cookie 是服务器通知客户端保存键值对的一种技术。
- 客户端有了 Cookie 后,每次请求都发送给服务器。
- 每个 Cookie 的大小不能超过 4kb
二、Cookie的特点
Cookie的特点包括:
-
持久性:Cookie可以设置一个过期时间,在这个时间之前,浏览器会持续保存该Cookie并在用户下次访问网站时发送回服务器。这使得网站可以长期跟踪用户的行为和偏好。
-
可扩展性:Cookie可以存储任意类型的数据,如用户标识、用户首选项等。这使得网站可以根据用户的需求和行为来提供个性化的服务。
-
安全性:Cookie可以设置为只在通过安全连接(如HTTPS)时传输,或者只能通过服务器访问,从而增加了一定的安全性。
-
灵活性:Cookie可以通过设置路径和域来限制它们的作用范围,使得不同的网页或子域可以拥有各自的Cookie。
总的来说,Cookie在互联网应用中起到了重要的作用,它可以实现用户的状态跟踪和个性化服务。然而,由于Cookie会在用户计算机上存储一些个人信息,因此也引发了一些安全和隐私的问题。
二、如何创建 Cookie?
public class CookieServlet extends BaseServlet {protected void createCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//1.创建cookie对象Cookie cookie1 = new Cookie("key4","value4");//2. 通知客户端保存Cookieresp.addCookie(cookie1);//1. 创建cookie对象Cookie cookie2 = new Cookie("key5","value5");//2. 通知客户端保存Cookieresp.addCookie(cookie2);resp.getWriter().write("Cookie创建成功"); }
}
三、服务器如何获取 Cookie
服务器获取客户端的 Cookie 只需要一行代码:req.getCookies():Cookie[]
public class CookieUtils {/*** 查找指定名称的Cookie对象* @param name* @param cookies* @return*/public static Cookie findCookie(String name , Cookie[] cookies){if (name == null || cookies == null || cookies.length == 0) {return null;}for (Cookie cookie : cookies) {if (name.equals(cookie.getName())) {return cookie;}}return null;}}
Servlet :
protected void getCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {Cookie[] cookies = req.getCookies();for (Cookie cookie : cookies) {// getName方法返回Cookie的key(名)// getValue方法返回Cookie的value值resp.getWriter().write("Cookie[" + cookie.getName() + "=" + cookie.getValue() + "] <br/>");}Cookie iWantCookie = CookieUtils.findCookie("key1", cookies);// for (Cookie cookie : cookies) {
// if ("key2".equals(cookie.getName())) {
// iWantCookie = cookie;
// break;
// }
// }// 如果不等于null,说明赋过值,也就是找到了需要的Cookieif (iWantCookie != null) {resp.getWriter().write("找到了需要的Cookie");}}
四、Cookie 值的修改
4.1 方案一
- 先创建一个要修改的同名(指的就是 key)的 Cookie 对象
- 在构造器,同时赋于新的 Cookie 值。
- 调用 response.addCookie( Cookie );
4.2 方案二
- 先查找到需要修改的 Cookie 对象
- 调用 setValue()方法赋于新的 Cookie 值。
- 调用 response.addCookie()通知客户端保存修改
protected void updateCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 方案一:
// 1、先创建一个要修改的同名的Cookie对象
// 2、在构造器,同时赋于新的Cookie值。Cookie cookie = new Cookie("key1","newValue1");
// 3、调用response.addCookie( Cookie ); 通知 客户端 保存修改resp.addCookie(cookie);// 方案二:
// 1、先查找到需要修改的Cookie对象Cookie cookie = CookieUtils.findCookie("key2", req.getCookies());if (cookie != null) {
// 2、调用setValue()方法赋于新的Cookie值。cookie.setValue("newValue2");//值不能为中文,除非必须使用base64编码
// 3、调用response.addCookie()通知客户端保存修改resp.addCookie(cookie);}resp.getWriter().write("key1的Cookie已经修改好");}
五、浏览器查看 Cookie
谷歌浏览器如何查看 Cookie:
火狐浏览器如何查看 Cookie:
edge浏览器如何查看 Cookie:
六、Cookie 生命控制
- Cookie 的生命控制指的是如何管理 Cookie 什么时候被销毁(删除)
setMaxAge()
- 正数,表示在指定的秒数后过期
- 负数,表示浏览器一关,Cookie 就会被删除(默认值是-1)
- 零,表示马上删除 Cookie
/*** 设置存活1个小时的Cooie* @param req* @param resp* @throws ServletException* @throws IOException*/protected void life3600(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {Cookie cookie = new Cookie("life3600", "life3600");cookie.setMaxAge(60 * 60); // 设置Cookie一小时之后被删除。无效resp.addCookie(cookie);resp.getWriter().write("已经创建了一个存活一小时的Cookie");}/*** 马上删除一个Cookie* @param req* @param resp* @throws ServletException* @throws IOException*/protected void deleteNow(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 先找到你要删除的Cookie对象Cookie cookie = CookieUtils.findCookie("key4", req.getCookies());if (cookie != null) {// 调用setMaxAge(0);cookie.setMaxAge(0); // 表示马上删除,都不需要等待浏览器关闭// 调用response.addCookie(cookie);resp.addCookie(cookie);resp.getWriter().write("key4的Cookie已经被删除");}}/*** 默认的会话级别的Cookie* @param req* @param resp* @throws ServletException* @throws IOException*/protected void defaultLife(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {Cookie cookie = new Cookie("defalutLife","defaultLife");cookie.setMaxAge(-1);//设置存活时间resp.addCookie(cookie);}
七、Cookie 有效路径 Path 的设置
- Cookie 的有效路径(Path)指定了哪些路径下发送的请求会附带该 Cookie。只有与 Cookie 的有效路径匹配的请求才会携带该 Cookie。
常见的可选值有以下几种:
- 默认值(
/
):表示服务器的根路径,所有请求都会携带该 Cookie; - 特定路径:例如,设置为
/myapp
表示只有路径以/myapp
开头的请求会携带该 Cookie; - 精确路径:例如,设置为
/myapp/index.html
表示只有请求路径为/myapp/index.html
的请求会携带该 Cookie; - 目录路径(目录名后带斜杠):例如,设置为
/myapp/
表示只有路径以/myapp/
开头的请求会携带该 Cookie。例如,请求路径为/myapp/page1
或者/myapp/page2
都会携带该 Cookie。
-
注意事项:
- Cookie 的有效路径是以斜杠
/
开头的路径字符串。 - 如果不指定有效路径,默认为根路径,即所有请求都会携带该 Cookie。
- Cookie 只会被发送到与其有效路径匹配的请求中。
- 如果请求路径包含多个目录,例如
/myapp/subfolder/page.html
,则该请求会携带该路径下的所有符合条件的 Cookie。
- Cookie 的有效路径是以斜杠
-
有效路径的设置可以帮助服务器控制哪些请求会附带 Cookie,从而实现更精确的控制和提高安全性。
-
举例:
CookieA path=/工程路径
CookieB path=/工程路径/abc
举例一:
请求地址如下: http://ip:port/工程路径/a.html
CookieA 发送
CookieB 不发送
举例二:
http://ip:port/工程路径/abc/a.html
CookieA 发送
CookieB 发送
protected void testPath(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {Cookie cookie = new Cookie("path1", "path1");// getContextPath() ===>>>> 得到工程路径cookie.setPath( req.getContextPath() + "/abc" ); // ===>>>> /工程路径/abcresp.addCookie(cookie);resp.getWriter().write("创建了一个带有Path路径的Cookie");}
八、案例:Cookie 练习—免输入用户名登录
login.jsp
<%--Created by IntelliJ IDEA.User: HeyDate: 2022/4/10Time: 19:55To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<form action="http://localhost:8080/13_cookie_session/LoginServlet" method="get">用户名:<input type="text" name="username" value="${cookie.username.value}"/></br>密码:<input type="password" name="password"></br><input type="submit" value="提交">
</form></body>
</html>
loginServlet
public class loginServlet extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String name = request.getParameter("username");String password = request.getParameter("password");if("abc".equals(name)&&"123456".equals(password)){Cookie cookie = new Cookie("username","abc");response.addCookie(cookie);System.out.println("登陆成功!");cookie.setMaxAge(60*60*24*7);}else{System.out.println("登陆失败!");}}
}