Cookie详情(含前端和后端干系示例)

诗林  金牌会员 | 2024-10-29 18:54:20 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 581|帖子 581|积分 1743

1. 什么是 Cookie?

HTTP 是无状态的协议,每次客户端(如浏览器)向服务器发送哀求时,服务器并不会记着之前的哀求。这时间 Cookie 就派上用场了。Cookie 是由服务器生成并存储在客户端浏览器中的一小段数据。每次客户端发起哀求时,浏览器会自动将 Cookie 发送给服务器,从而实近况态的保持。Cookie 可以用于以下几种场景:


  • 会话管理:如用户登录状态、购物车等。
  • 个性化设置:如用户偏好设置、主题等。
  • 跟踪用户行为:如记任命户访问网站的环境,常用于广告投放等场景。
2. Cookie 的根本结构

Cookie 的格式是一个 key=value 的键值对,除此之外,Cookie 还可以包含一些属性。常见的 Cookie 属性如下:


  • Name:Cookie 的名字(Key)。
  • Value:Cookie 的值。
  • Domain:指定 Cookie 适用的域名。
  • Path:指定 Cookie 适用的 URL 路径。
  • Expires/Max-Age:指定 Cookie 的逾期时间或最大存活时间。Expires 是具体的日期时间,Max-Age 是秒数。
  • Secure:只允许在 HTTPS 连接中传输该 Cookie。
  • HttpOnly:限定客户端 JavaScript 访问 Cookie,增加安全性。
  • SameSite:用于防止跨站哀求伪造(CSRF)攻击,可以设置为 Strict、Lax 或 None。
3. 前端如何操纵 Cookie(JavaScript 示例)

JavaScript 提供了一些原生的 API 来操纵浏览器中的 Cookie,如 document.cookie。
3.1 设置 Cookie

  1. // 设置一个 Cookie,有效期为 7 天
  2. function setCookie(name, value, days) {
  3.   let expires = "";
  4.   if (days) {
  5.     let date = new Date();
  6.     date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); // 将天数转换为毫秒
  7.     expires = "; expires=" + date.toUTCString();
  8.   }
  9.   document.cookie = name + "=" + (value || "") + expires + "; path=/";
  10. }
  11. setCookie("username", "JohnDoe", 7);  // 设置一个名为 'username' 的 Cookie,有效期 7 天
复制代码
3.2 获取 Cookie

  1. // 获取指定名字的 Cookie
  2. function getCookie(name) {
  3.   let nameEQ = name + "=";
  4.   let ca = document.cookie.split(';');
  5.   for (let i = 0; i < ca.length; i++) {
  6.     let c = ca[i];
  7.     while (c.charAt(0) == ' ') c = c.substring(1, c.length);
  8.     if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
  9.   }
  10.   return null;
  11. }
  12. let user = getCookie("username");  // 获取名为 'username' 的 Cookie 值
复制代码
3.3 删除 Cookie

  1. // 删除指定名字的 Cookie
  2. function eraseCookie(name) {
  3.   document.cookie = name + '=; Max-Age=-99999999;';  // 设置 Max-Age 为负值删除 Cookie
  4. }
  5. eraseCookie("username");  // 删除 'username' 的 Cookie
复制代码
3.4 Cookie 操纵留意事项



  • Cookie 的巨细限定通常为 4KB(包罗名字、值和属性)。
  • 每个域名下的 Cookie 数量通常限定为 20-50 个不等。
  • JavaScript 操纵 Cookie 时,假如设置了 HttpOnly 属性,Cookie 将无法通过 document.cookie 举行访问。
4. 后端如何操纵 Cookie(Spring 框架 Java 示例)

在后端使用 Spring 框架时,操纵 Cookie 通常涉及设置 Cookie 到响应中,以及从哀求中读取 Cookie。
4.1 设置 Cookie

  1. import javax.servlet.http.Cookie;
  2. import javax.servlet.http.HttpServletResponse;
  3. import org.springframework.web.bind.annotation.GetMapping;
  4. import org.springframework.web.bind.annotation.RestController;
  5. @RestController
  6. public class CookieController {
  7.     @GetMapping("/set-cookie")
  8.     public String setCookie(HttpServletResponse response) {
  9.         // 创建一个 Cookie 对象
  10.         Cookie cookie = new Cookie("username", "JohnDoe");
  11.         
  12.         // 设置 Cookie 的有效路径
  13.         cookie.setPath("/");
  14.         
  15.         // 设置 Cookie 的有效期为 7 天
  16.         cookie.setMaxAge(7 * 24 * 60 * 60);
  17.         
  18.         // 添加到响应中
  19.         response.addCookie(cookie);
  20.         
  21.         return "Cookie 已设置";
  22.     }
  23. }
复制代码
4.2 获取 Cookie

  1. import javax.servlet.http.Cookie;
  2. import javax.servlet.http.HttpServletRequest;
  3. import org.springframework.web.bind.annotation.GetMapping;
  4. import org.springframework.web.bind.annotation.RestController;
  5. @RestController
  6. public class CookieController {
  7.     @GetMapping("/get-cookie")
  8.     public String getCookie(HttpServletRequest request) {
  9.         // 从请求中获取所有 Cookie
  10.         Cookie[] cookies = request.getCookies();
  11.         if (cookies != null) {
  12.             for (Cookie cookie : cookies) {
  13.                 if ("username".equals(cookie.getName())) {
  14.                     return "Cookie 值: " + cookie.getValue();
  15.                 }
  16.             }
  17.         }
  18.         return "Cookie 不存在";
  19.     }
  20. }
复制代码
4.3 删除 Cookie

  1. import javax.servlet.http.Cookie;
  2. import javax.servlet.http.HttpServletResponse;
  3. import org.springframework.web.bind.annotation.GetMapping;
  4. import org.springframework.web.bind.annotation.RestController;
  5. @RestController
  6. public class CookieController {
  7.     @GetMapping("/delete-cookie")
  8.     public String deleteCookie(HttpServletResponse response) {
  9.         // 创建一个名为 'username' 的 Cookie,并将其 Max-Age 设置为 0 以删除它
  10.         Cookie cookie = new Cookie("username", null);
  11.         cookie.setMaxAge(0);
  12.         cookie.setPath("/");
  13.         
  14.         // 添加到响应中
  15.         response.addCookie(cookie);
  16.         
  17.         return "Cookie 已删除";
  18.     }
  19. }
复制代码
5. Cookie 安全性问题

5.1 HttpOnly 属性

HttpOnly 是一种非常重要的安全属性。它防止客户端 JavaScript 读取 Cookie,降低了 XSS(跨站脚本攻击)的风险。设置 HttpOnly 时,Cookie 只能通过 HTTP 哀求发送,JavaScript 无法访问该 Cookie。
在 Java 中,你可以通过以下方式设置 HttpOnly:
  1. cookie.setHttpOnly(true);  // 设置 HttpOnly 属性
复制代码
5.2 Secure 属性

Secure 属性确保 Cookie 仅通过 HTTPS 传输,防止数据在传输过程中被盗取。你可以通过以下方式设置 Secure:
  1. cookie.setSecure(true);  // 设置 Secure 属性
复制代码
5.3 SameSite 属性

SameSite 属性防止跨站哀求伪造(CSRF)攻击,可以设置为:


  • Strict:严格模式,禁止任何跨站哀求携带 Cookie。
  • Lax:宽松模式,允许部分跨站哀求(如 GET 哀求)携带 Cookie。
  • None:允许跨站哀求携带 Cookie,但要求使用 HTTPS 连接。
在 Java 中,你可以使用 ResponseCookie 类来设置 SameSite 属性:
  1. ResponseCookie cookie = ResponseCookie.from("username", "JohnDoe")
  2.         .path("/")
  3.         .maxAge(7 * 24 * 60 * 60)
  4.         .httpOnly(true)
  5.         .secure(true)
  6.         .sameSite("Strict")
  7.         .build();
  8. response.addHeader(HttpHeaders.SET_COOKIE, cookie.toString());
复制代码
6. 示例:综合前后端操纵 Cookie

6.1 前端 JavaScript 设置 Cookie 并通过 Ajax 哀求发送

  1. // 前端设置 Cookie 并发送 Ajax 请求
  2. setCookie("username", "JohnDoe", 7);
  3. fetch('/get-cookie', {
  4.   method: 'GET',
  5.   credentials: 'include'  // 无论是同源还是跨域请求,都携带Cookie
  6. })
  7. .then(response => response.text())
  8. .then(data => console.log(data));
复制代码
6.2 后端 Java 处置处罚 Cookie 哀求

  1. import org.springframework.web.bind.annotation.CrossOrigin;
  2. import javax.servlet.http.Cookie;
  3. import javax.servlet.http.HttpServletRequest;
  4. import org.springframework.web.bind.annotation.GetMapping;
  5. import org.springframework.web.bind.annotation.RestController;
  6. @RestController
  7. @CrossOrigin(origins = "http://localhost:3000" allowCredentials = "true")  // 允许跨域请求并携带Cookie
  8. public class CookieController {
  9.     @GetMapping("/get-cookie")
  10.     public String getCookie(HttpServletRequest request) {
  11.         Cookie[] cookies = request.getCookies();
  12.         if (cookies != null) {
  13.             for (Cookie cookie : cookies) {
  14.                 if ("username".equals(cookie.getName())) {
  15.                     return "Cookie 值: " + cookie.getValue();
  16.                 }
  17.             }
  18.         }
  19.         return "Cookie 不存在";
  20.     }
  21. }
复制代码
7. 总结



  • Cookie 是存储在客户端的小数据,用于保持状态。
  • JavaScript 可以使用 document.cookie 来设置、获取和删除 Cookie。
  • Spring 后端 使用 HttpServletRequest 和 HttpServletResponse 来操纵 Cookie。
  • 安全性问题:使用 HttpOnly 防止

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

诗林

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表