一文理解Cookie、Session1、什么是会话
用户打开浏览器,点击多个超链接,访问服务器的多个web资源,然后关闭浏览器,整个过程就称为一个会话;HTTP 是无状态,有会话的
HTTP 是无状态的:在同一个连接中 , 两个执行成功的请求之间是没有关系的 。这就带来了一个问题,用户没有办法在
同一个网站中进行连续的交互
,比如在一个电商网站里 , 用户把某个商品加入到购物车,切换一个页面后再次添加了商品,这两次添加商品的请求之间没有关联,浏览器无法知道用户最终选择了哪些商品 。而使用 HTTP 的头部扩展,HTTP Cookies 就可以解决这个问题 。把 Cookies 添加到头部中,创建一个会话让每次请求都能共享相同的上下文信息,达成相同的状态 。2、Cookie简单来说:是服务器发送到浏览器,并保存在浏览器端的一小块数据 。
当用户使用浏览器再去访问服务器中的 web 资源时 , 就会带着各自的数据去 。这样 , web 资源处理的就是用户各自的数据了 。
cookie工作流程
文章插图
示例代码:基于SpringBoot构建测试环境:
@RestController@RequestMapping("/alpha")@Slf4jpublic class AlphaController {/*** cookie示例*/@RequestMapping("/cookie/set")public String setCookie(HttpServletResponse response) {// 创建实例Cookie cookie = new Cookie("code", CommunityUtil.generateUUID());// 过期时间cookie.setMaxAge(60 * 10);// cookie的生效范围 也就是在访问什么资源的情况下需要携带此cookiecookie.setPath("/community/alpha");response.addCookie(cookie);return "set cookie ok?。。?;}/*** 获取cookie*/@GetMapping("/cookie/get")public String getCookie(@CookieValue("code") String code) {log.warn("【获取cookie】 code = {} ", code);return "get cookie ok!!!";}}
启动项目,浏览器访问文章插图
cookie属性项:属性项属性项介绍NAME=VALUE键值对,可以设置要保存的 Key/Value,注意这里的 NAME 不能和其他属性项的名字一样Path当访问哪个路径时,携带此tokenExpires过期时间,在设置的某个时间点后该 Cookie 就会失效Domain生成该 Cookie 的域名,如 domain="www.baidu.com"Secure如果设置了这个属性 , 那么只会在 SSH 连接时才会回传该 Cookie3、Session
session,存储在我们的服务端,下图是session工作流程图 。
- 也就是说,服务器只返回对应的sessionId给浏览器
文章插图
示例代码:基于SpringBoot构建测试环境
/*** session示例*/@RequestMapping("/session/set")public String setCookie(HttpSession session) {session.setAttribute("code", "0000");return "set cookie ok?。。?;}/*** 获取session*/@GetMapping("/session/get")public String getCookie(HttpSession session) {log.warn("【获取cookie】 code = {} ", session.getAttribute("code"));return "get cookie ok!!!";}
启动项目,浏览器访问文章插图
可以看到,服务器只返回sessionID4、两者区别
- cookie数据存放在客户的浏览器(客户端)上,session数据放在服务器上,但是服务端的session的实现对客户端的cookie有依赖关系的;
- cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session;
- session会在一定时间内保存在服务器上 。当访问增多 , 会比较占用你服务器的性能 。考虑到减轻服务器性能方面,应当使用COOKIE;
- 单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能超过3K;
推荐阅读
- 【一】ERNIE:飞桨开源开发套件,入门学习,看看行业顶尖持续学习语义理解框架,如何取得世界多个实战的SOTA效果?
- 一步一图带你深入理解 Linux 虚拟内存管理
- 深入理解独占锁ReentrantLock类锁
- jmeter中获取token和cookie
- 一 RNN自学理解
- <三>从编译器角度理解C++代码编译和链接原理
- 一文读懂 MySQL 索引
- gradle项目对比maven项目的目录架构以及对gradle wrapper的理解
- 斗鱼 H5 直播原理解析,它是如何省了 80% 的 CDN 流量?
- 一文讲清楚 JVM Safe Point