当前位置: 首页 > news >正文

cookie与session的区别+springboot使用

目录

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • i2c讲解以及zyqn中的使用
  • vue的diff算法的【双端比较】策略
  • C++中如果函数a的参数是class v,class z是v的子类,可否将z的对象当参数传给函数a,可以
  • SystemUI plugin 开发
  • 2024年中职语文统编教材线上培训答案
  • 多线程 02:线程实现,创建线程的三种方式,通过多线程下载图片案例分析异同(Thread,Runnable,Callable)
  • python 文件打开、读、关闭练习
  • 【物联网】微信小程序ios如何自动打开蓝牙
  • Django Rest Framework -解析器
  • Linux中如何复制贴贴删除
  • C++速学day2
  • All-Reduce通信原语;Reduce+LayerNorm+Broadcast算子;gRPC:远程过程调用(RPC)框架;
  • ElementUI 事件回调函数传参技巧与自定义参数应用
  • TypeScript基础【学习笔记】
  • Rabbit高级特性 - 消息重试机制(两种实现)
  • 【面试系列】之二:关于js原型
  • CSS 提示工具(Tooltip)
  • Druid 在有赞的实践
  • ES6核心特性
  • HashMap ConcurrentHashMap
  • HTTP--网络协议分层,http历史(二)
  • webpack4 一点通
  • 从零开始的无人驾驶 1
  • 翻译--Thinking in React
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 蓝海存储开关机注意事项总结
  • 扑朔迷离的属性和特性【彻底弄清】
  • 如何解决微信端直接跳WAP端
  • 收藏好这篇,别再只说“数据劫持”了
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • #1015 : KMP算法
  • (12)Hive调优——count distinct去重优化
  • (delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第2节(泛型类的类构造函数)
  • (TOJ2804)Even? Odd?
  • (多级缓存)缓存同步
  • (二)PySpark3:SparkSQL编程
  • (二刷)代码随想录第15天|层序遍历 226.翻转二叉树 101.对称二叉树2
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (一)Docker基本介绍
  • (一)RocketMQ初步认识
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • (转)原始图像数据和PDF中的图像数据
  • 、写入Shellcode到注册表上线
  • .bat文件调用java类的main方法
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .Net Core 笔试1
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .net和jar包windows服务部署
  • .NET面试题(二)
  • .net专家(张羿专栏)