目录
- 1. cookie
- 1.1 介绍
- 1.2 作用
- 1.3 springboot操作cookie
- 2. session
- 2.1 介绍
- 2.2 作用
- 2.3 使用
- 3. 区别
- 参考链接
1. cookie
1.1 介绍
Cookie(也称为Web Cookie或浏览器Cookie)是一种存储在用户浏览器中的小型数据文件,通常由服务器生成并发送到用户的浏览器中。这些数据可以是文本形式,并且包含键值对、有效期、作用域和安全性等属性。
当用户首次访问一个网站时,服务器会创建一个Cookie,并通过HTTP响应头中的Set-Cookie字段发送给浏览器。浏览器会将这个Cookie保存在本地,通常是客户端计算机的硬盘或内存上。在用户下次访问该网站时,浏览器会自动将此Cookie附加到请求中并发送回服务器。服务器接收到这个Cookie后,可以根据其中的信息识别用户身份,从而实现诸如保持登录状态、个性化设置等功能。
1.2 作用
Cookie是一种小型文本文件,通常由Web服务器生成并发送到用户的浏览器中。它在客户端和服务器之间传递数据,具有多种作用:
保存用户数据:Cookie可以在客户端上保存用户的各种数据,如登录状态、身份识别信息等。当用户再次访问网站时,浏览器会将这些Cookie一同发送给服务器,从而实现自动登录、保存浏览历史等功能。
记录用户偏好和行为:Cookie帮助网站记住用户的偏好和行为,从而提供更好的用户体验。例如,在购物网站上添加商品到购物车后,即使用户关闭了浏览器,购物车中的内容仍然会被保留。
保持Web应用程序的连续性:由于HTTP协议是无状态的,因此需要通过Cookie来保持Web应用的状态管理。这样可以确保用户在多次请求之间保持一致的体验。
个性化设置:Cookie可以用于存储用户的个性化设置,如主题、语言偏好等。这使得用户在不同时间访问同一网站时能够看到符合其偏好的内容。
会话管理:Cookie常用于记录用户的会话状态,包括登录状态、访问次数等信息。这样可以在用户重新访问网站时识别其身份,并提供相应的服务。
跨域数据交换:虽然Cookie主要用于在同一域名下的数据交换,但其可以通过设置Domain属性实现跨子域名的数据共享。
广告和跟踪:许多Cookie还被用于收集用户的浏览历史和在线行为数据,以便进行精准广告投放和行为分析。
1.3 springboot操作cookie
在Spring Boot中设置Cookie主要依赖于HttpServletResponse类的addCookie()方法,同时可以通过ResponseCookie工具类进行更复杂的自定义操作。
设置一个简单的Cookie:
import org.springframework.web.bind.annotation.GetMapping ;
import org.springframework.web.bind.annotation.RestController ;
import javax.servlet.http.HttpServletResponse ;@RestController
public class CookieController {@GetMapping("/setCookie")public void setCookie(HttpServletResponse response) {// 创建一个新的Cookie对象Cookie cookie = new Cookie("name", "value");// 设置Cookie的最大存活时间为30天cookie.setMaxAge (30 * 24 * 60 * 60);// 设置Cookie的路径为根路径,即“/”cookie.setPath ("/");// 将Cookie添加到响应中response.addCookie (cookie);}
}
使用Spring定义的ResponseCookie工具类:
import org.springframework.http.HttpHeaders ;
import org.springframework.web.bind.annotation.GetMapping ;
import org.springframework.web.bind.annotation.RestController ;@RestController
public class CookieController {@GetMapping("/setCookieWithSameSite")public void setCookieWithSameSite(HttpServletResponse response) {// 使用ResponseCookie构建工具类ResponseCookie cookie = ResponseCookie.from ("name", "value").maxAge(30 * 24 * 60 * 60) // 设置最大存活时间.path("/") // 设置路径.sameSite(ResponseCookie.SameSite Lax) // 设置SameSite属性为Lax.httpOnly(true); // 设置HttpOnly属性为true以防止XSS攻击// 将Cookie添加到响应中response.addHeader (HttpHeaders setCookie, cookie.toString ());}
}
2. session
2.1 介绍
Session是一种服务器端的数据存储机制,用于跟踪和管理用户在Web应用程序中的状态信息。它在计算机网络应用中被称为“会话控制”,其主要功能是为每个用户创建一个唯一的会话ID,并将该ID通过Cookie或URL重写的方式发送给客户端浏览器,在后续请求中携带。
当用户首次访问服务器时,服务器会为其创建一个唯一的Session对象,并生成一个对应的Cookie(通常名为JSESSIONID),其中包含这个唯一ID。这个ID确保了用户在不同页面之间跳转时,服务器能够识别并访问存储在该Session中的数据。
2.2 作用
Session在计算机网络应用中,尤其是Web应用程序中,是一种用于会话控制和状态管理的机制。其主要作用如下:
-
保存用户数据:Session对象存储特定用户会话所需的属性及配置信息,这样当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。
-
唯一标识用户:每个用户访问时,服务器都会为该用户分配一个唯一的会话ID(Session ID),这个ID通过Cookie或URL重写的方式发送给客户端浏览器,并在后续的请求中携带。这样可以区分不同用户的请求,确保数据的一致性和安全性。
-
保持用户状态:Session技术能够保持用户的状态信息,实现用户登录、购物车、个性化设置等功能。例如,在用户登录后,Session可以存储用户的登录状态,以便在后续请求中识别该用户并提供相应的服务。
-
数据共享:Session可以在一次会话的多次请求之间共享数据,将数据保存到服务器端。这意味着在用户在系统中不同的web页面之间进行跳转时,存储在Session中的数据不会丢失。
-
生命周期管理:Session的生命周期是用户持续请求时间再加上一段时间(一般为20分钟左右),当用户关闭浏览器或者超时未操作时,Session会被销毁。
-
提高用户体验:由于Session可以存储和传递用户的数据,因此可以避免重复输入信息,提升用户体验。例如,在购物车功能中,Session可以记住用户的购物选择,在用户多次访问期间保持这些选择。
-
Session作为一种服务器端的数据存储机制,主要用于跟踪和管理用户会话相关的数据,确保用户在不同页面之间的数据一致性和连续性,从而提升用户体验和系统的可用性。
2.3 使用
Session的生命周期
- 创建:当用户首次访问服务器时,服务器创建一个Session对象,并生成一个唯一的Session ID。
- 使用:用户在不同页面之间跳转时,携带这个Session ID,服务器通过这个ID找到对应的Session对象,从而读取或修改其中的数据。
- 销毁:Session可以在一定时间后自动销毁,或者在用户主动注销时销毁。销毁的条件通常包括超过预设的空闲时间或用户明确退出系统。
import javax.servlet.http.HttpSession; @Controller
public class MyController { @RequestMapping("/setSession") public String setSessionAttribute(HttpSession session) { session.setAttribute("username", "JohnDoe"); return "redirect:/showSession"; } @RequestMapping("/showSession") public String showSessionAttribute(Model model, HttpSession session) { String username = (String) session.getAttribute("username"); model.addAttribute("username", username); return "sessionPage"; }
}
3. 区别
Session与Cookie是两种常见的用于跟踪用户状态和实现用户认证的机制,它们在存储位置、安全性、数据类型以及有效期等方面存在显著区别。
- 存储位置:
- Cookie:数据保存在客户端(浏览器)上。
- Session:数据保存在服务器端。
- 安全性:
- Cookie:由于数据存储在客户端,容易被攻击者通过分析本地文件进行篡改或窃取,因此被认为不够安全。为了提高安全性,通常会结合使用HTTPS协议来加密传输过程。
- Session:数据存储在服务器上,即使客户端被恶意攻击,攻击者也难以直接获取到敏感信息,因此相对更安全。
- 数据类型:
- Cookie:只能存储ASCII字符,如果需要存储非ASCII字符,则必须进行编码处理。
- Session:可以存储任意类型的数据,一般情况下可以看作是一个容器,能够存储更多复杂的数据结构。
- 有效期:
- Cookie:可以设置为长时间保持,甚至永久有效,具体取决于Cookie的生命周期设置。
- Session:通常在用户关闭浏览器或应用程序时终止,没有固定的生命周期,但可以通过配置延长其有效性。
- 存取方式:
- Cookie:每次请求服务器时都会携带Cookie,服务器根据Cookie中的信息识别用户身份。
- Session:服务器通过Session ID识别用户,当用户首次访问时生成一个唯一的Session ID并发送给客户端,后续请求中客户端会携带这个ID,服务器根据ID读取相应的Session数据。
- 性能影响:
- Cookie:由于数据存储在客户端,不会占用服务器资源,但会占用一定的客户端内存或磁盘空间。
- Session:由于数据存储在服务器上,会占用服务器资源,特别是在高并发情况下可能会对服务器性能产生较大影响。
- Cookie和Session各有优缺点。Cookie适合存储不敏感的信息且希望减少服务器负载的情况;而Session则更适合需要高安全性和复杂数据存储的场景。
参考链接
cookie详解,一篇文章彻底搞懂cookie
彻底了解Cookie和Session的区别(面试)