cookie与session的区别+springboot使用

ops/2024/10/11 9:22:39/

目录

  • 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应用程序中,是一种用于会话控制和状态管理的机制。其主要作用如下:

  1. 保存用户数据:Session对象存储特定用户会话所需的属性及配置信息,这样当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。

  2. 唯一标识用户:每个用户访问时,服务器都会为该用户分配一个唯一的会话ID(Session ID),这个ID通过Cookie或URL重写的方式发送给客户端浏览器,并在后续的请求中携带。这样可以区分不同用户的请求,确保数据的一致性和安全性。

  3. 保持用户状态:Session技术能够保持用户的状态信息,实现用户登录、购物车、个性化设置等功能。例如,在用户登录后,Session可以存储用户的登录状态,以便在后续请求中识别该用户并提供相应的服务。

  4. 数据共享:Session可以在一次会话的多次请求之间共享数据,将数据保存到服务器端。这意味着在用户在系统中不同的web页面之间进行跳转时,存储在Session中的数据不会丢失。

  5. 生命周期管理:Session的生命周期是用户持续请求时间再加上一段时间(一般为20分钟左右),当用户关闭浏览器或者超时未操作时,Session会被销毁。

  6. 提高用户体验:由于Session可以存储和传递用户的数据,因此可以避免重复输入信息,提升用户体验。例如,在购物车功能中,Session可以记住用户的购物选择,在用户多次访问期间保持这些选择。

  7. 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的区别(面试)


http://www.ppmy.cn/ops/92019.html

相关文章

没有mac电脑ios上架截屏截图的最新方法

很多人使用uniapp或其他跨平台框架开发ios的app,上架的时候都会遇到一个问题,上架的时候需要各种尺寸的设备来做ios截屏,比如目前最新的要求是,需要对6.7寸、6.5寸和5.5寸的iphone进行截屏,假如支持ipad则还需要对ipad…

xUnit 单元测试、加密解密

一、xUnit 单元测试 官网地址:Home > xUnit.net 1、概述 1.1、新建个控制台项目 public class Class1{public int Add(int x, int y){return x y;}} 2、建个xUnit测试项目 public class UnitTest1{[Fact]public void Test1(){Class1 class1 new Class1();…

zabbix监控

1、概念 自带图形化界面,通过网页就可以监控所有服务器的状态。 事件告警、邮件通知 web界面提供的分布式监控以及网络监控功能的开源的企业级的软件解决方案 zabbix可以提供各种类型的监控模版,保证服务器的正常运行,灵活的通知机制可以…

【Linux】常见指令

目录 一、指令的理解二、Linux的目录结构三、XShell 下的热键四、shell命令以及运行原理五、Linux常见的指令汇总1. ls 指令1.1 常见的一些有关 ls 的别名1.2 隐藏文件或目录1.3 * 的匹配 2. pwd 指令3. cd 指令3.1 cd . . 指令 4. touch指令5. mkdir指令6. rmdir指令 &&am…

Python 爬虫项目实战五:抓取天猫超市商品信息

在这篇博客中,我们将通过一个实际的Python爬虫项目,详细讲解如何抓取网页数据。本次选择的实战项目是抓取天猫超市商品信息,通过这个项目,你将学会如何使用Python编写爬虫,从网页中提取有用的商品数据。 一、项目准备…

vue配置electron,使用electron-builder进行打包【完整步骤】

目 录 1. 已知:vue3项目已经创建好 一、配置Electron 1. 安装electron 2. 在根目录创建electron 文件夹,并新建main.js 和preload.js 3.在package.json 中配置添加以下代码: 4. 安装concurrently 5. 安装 nodemon 实现热更新 6…

C++ 类和对象(上)

文章目录 类的定义及访问限定符类域类的实例化对象的大小this指针 类的定义及访问限定符 类的格式: class为类的关键字,class 类的名字(自定义) {} ;类中可以定义成员变量也可以定义成员函数,在类中定义…

阿里云万网推出首个域名AI大模型智能体应用,上线“.ai”等40个全新域名后缀

中国域名保有量3160万,以9.4%的份额位居全球第二。 域名资源越来越紧张,运维越来越复杂,面对的网络攻击也越来越频繁,都给这一领域提出了更大挑战。 8月8日,在阿里云万网焕新发布会上,阿里云宣布域名产品服…