📝个人主页:五敷有你
🔥系列专栏:Http协议
⛺️稳重求进,晒太阳
概念
Cookie(饼干)是一种小型的文本文件,由网站服务器通过用户的浏览器存储在用户计算机或移动设备上。它的主要目的是在用户的浏览器和服务器之间传递信息,以便在用户访问同一网站时能够辨认用户身份、记住用户偏好或提供个性化服务。
定义: Cookie是由Netscape公司在1994年首次引入的,现已成为Web浏览器中普遍使用的技术标准之一。HTTP协议是一种无状态的协议,意味着服务器在处理每个请求时都不会记住之前的请求。Cookie通过在用户计算机上存储一小段数据,使得服务器能够在用户访问同一站点时识别用户,从而提供更个性化的服务。
Cookie通常包含以下信息:
- 名称(Name): Cookie的标识符,用于在服务器和浏览器之间唯一标识特定的Cookie。
- 值(Value): 与Cookie相关联的数据,可以是用户的偏好设置、会话信息等。
- 域(Domain): Cookie所属的域名,确定哪些服务器可以接收该Cookie。
- 路径(Path): 指定与Cookie关联的特定路径,限定哪些页面可以访问该Cookie。
- 过期时间(Expires): 指定Cookie的有效期,超过该时间后Cookie将被删除。
- 安全标志(Secure): 如果存在,表示Cookie只能通过安全的HTTPS连接传输。
cookie的工作原理
服务器创建Cookie:
当用户首次访问一个网站时,服务器可能会在响应中包含一个Set-Cookie头,其中包含了要在用户端存储的Cookie信息。这个信息通常包括Cookie的名称、值、过期时间等。
浏览器存储Cookie:
当用户再次访问同一网站时,浏览器会将之前存储的与该站点相关的Cookie信息包含在请求头中。这通常通过Cookie头字段来实现。
后续请求中发送Cookie:
当用户再次访问同一网站时,浏览器会将之前存储的与该站点相关的Cookie信息包含在请求头中。这通常通过Cookie头字段来实现。
服务器读取Cookie:
服务器在接收到包含Cookie的请求后,可以通过解析请求头中的Cookie字段来识别用户。根据Cookie的内容,服务器可以提供个性化的服务或根据需要进行其他操作。你看csdn的cookie中就存有我的一个标识信息,可以很清晰的识别用户
Cookie的更新和过期:
- 在服务器响应中,可以通过Set-Cookie头来更新Cookie的信息,例如延长其过期时间或修改其值。浏览器会按照新的信息更新本地存储的Cookie。
- 如果设置了Cookie的过期时间,在过期时间到达后,浏览器将不再发送该Cookie,同时清理本地存储的过期Cookie。
如下,就是过期的时间,过期后,浏览器将清除cookie
Cookie的类型
Cookie主要分为会话Cookie(Session Cookie)和持久Cookie(Persistent Cookie),以及根据在浏览器中的使用情况分为第一方Cookie和第三方Cookie。以下是对这些类型的详细解释
会话Cookie(Session Cookie):
会话Cookie存储在用户计算机的内存中,并且通常在用户关闭浏览器时被删除。它们用于跟踪用户的会话信息,例如在网站上浏览的页面、购物车内容等。由于会话Cookie的短暂性,它们对于临时存储用户状态非常有用。
在 Web 开发中,术语“会话 Cookie”通常是指没有显式设置过期时间,而是在用户关闭浏览器时自动删除的 Cookie。而如果设置了过期时间,即使是一个较短的时间,该 Cookie 仍然可以被认为是具有过期时间的 Cookie。
如果想创建一个在用户关闭浏览器时自动删除的会话 Cookie,可以不设置
setMaxAge
或将其设置为负值,例如setMaxAge(-1)
。
持久Cookie(Persistent Cookie):
持久Cookie具有指定的过期时间,可以存储在用户计算机上一段较长的时间。即使用户关闭浏览器,持久Cookie仍然可以保留,直到过期时间到达或用户手动删除。这使得持久Cookie可用于存储用户偏好、登录信息等长期数据。
Cookie的应用场景
用户身份验证:
Cookie可用于存储用户的登录状态信息,使用户在访问网站时无需重复登录。这对于提高用户体验和网站安全性非常重要。
记住用户设置:
通过Cookie,网站可以记住用户的一些设置,例如字体大小、主题选择、地理位置等,以确保用户在访问时保持一致的界面和体验。
安全性:
Cookie可以用于实现安全性控制,例如防止跨站请求伪造(CSRF)攻击。通过将令牌存储在Cookie中,可以提高用户身份验证的安全性。
Cookies的常用方法
前端JS
后端
HttpServletRequest对象获取Cookie:
Cookie[] cookies = request.getCookies();
在Servlet中,你可以使用HttpServletRequest
对象来获取客户端发送的Cookie。
这将返回一个Cookie
数组,可以遍历该数组以获取特定名称的Cookie。
创建和设置Cookie
Cookie cookie = new Cookie("username", "zy");
cookie.setMaxAge(3600); // 设置Cookie的过期时间,单位为秒
response.addCookie(cookie);
使用Cookie
类可以创建新的Cookie,并将其添加到HttpServletResponse
中。
上述代码创建了一个名为 "username" 值为 "zy" 的Cookie,并设置了它的过期时间为3600秒(1小时)。
遍历和读取Cookie:
通过HttpServletRequest
对象获取的Cookie数组,你可以遍历并读取Cookie的值。
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
String name = cookie.getName();
String value = cookie.getValue(); // 进行相应的处理
}
}
设置Cookie路径和域:
Cookie cookie = new Cookie("user", "john_doe");
cookie.setPath("/app"); // 设置Cookie的路径
cookie.setDomain(".example.com"); // 设置Cookie的域
response.addCookie(cookie);
通过setPath
和setDomain
方法,可以设置Cookie的路径和域。
上述代码将Cookie的路径设置为 "/app",表示该Cookie只在路径为 "/app" 的页面中可见;
将Cookie的域设置为 ".example.com",表示该Cookie对所有以 ".example.com" 结尾的域名都可见。
当你设置一个 Cookie 的路径为 "/app" 时,这表示该 Cookie 只在以 "/app" 开头的路径下有效。具体来说:
如果你的网站域名是 "example.com",那么这个 Cookie 在 "example.com/app" 下是可见的。
如果你有多个服务器,比如 "www.example.com"、"app.example.com" 等,只要它们属于 "example.com" 域,那么在这些服务器下以 "/app" 开头的路径都能访问这个 Cookie。
但是,如果路径不是以 "/app" 开头的,比如 "/other" 或者根路径 "/",那么这个 Cookie 将不可见。