一文理解Cookie、Session

1、什么是会话

用户打开浏览器,点击多个超链接,访问服务器的多个web资源,然后关闭浏览器,整个过程就称为一个会话;

HTTP 是无状态,有会话的

HTTP 是无状态的:在同一个连接中,两个执行成功的请求之间是没有关系的。这就带来了一个问题,用户没有办法在同一个网站中进行连续的交互,比如在一个电商网站里,用户把某个商品加入到购物车,切换一个页面后再次添加了商品,这两次添加商品的请求之间没有关联,浏览器无法知道用户最终选择了哪些商品。而使用 HTTP 的头部扩展,HTTP Cookies 就可以解决这个问题。把 Cookies 添加到头部中,创建一个会话让每次请求都能共享相同的上下文信息,达成相同的状态。

2、Cookie

简单来说:是服务器发送到浏览器,并保存在浏览器端的一小块数据。

当用户使用浏览器再去访问服务器中的 web 资源时,就会带着各自的数据去。这样, web 资源处理的就是用户各自的数据了。

cookie工作流程

示例代码:

基于SpringBoot构建测试环境:

@RestController
@RequestMapping("/alpha")
@Slf4j
public class AlphaController {
/**
* cookie示例
*/
@RequestMapping("/cookie/set")
public String setCookie(HttpServletResponse response) {
// 创建实例
Cookie cookie = new Cookie("code", CommunityUtil.generateUUID());
// 过期时间
cookie.setMaxAge(60 * 10);
// cookie的生效范围 也就是在访问什么资源的情况下需要携带此cookie
cookie.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 当访问哪个路径时,携带此token
Expires 过期时间,在设置的某个时间点后该 Cookie 就会失效
Domain 生成该 Cookie 的域名,如 domain="www.baidu.com"
Secure 如果设置了这个属性,那么只会在 SSH 连接时才会回传该 Cookie

3、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!!!";
}

启动项目,浏览器访问

可以看到,服务器只返回sessionID

4、两者区别

  1. cookie数据存放在客户的浏览器(客户端)上,session数据放在服务器上,但是服务端的session的实现对客户端的cookie有依赖关系的;
  2. cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session;
  3. session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能。考虑到减轻服务器性能方面,应当使用COOKIE;
  4. 单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能超过3K;

最新文章

  1. WEB – Architecture
  2. 使用Xmanager访问CentOS远程桌面
  3. IBatisNet使用教程
  4. Linux网络栈下两层实现
  5. 实时数据显示--SignalR实例演示
  6. ArcGIS Server 服务迁移、恢复
  7. Python语言初学总结
  8. dockerfile语法
  9. [extjs(1)]MyEclipse2014安装ext4插件Spket
  10. RTN 实操
  11. C#使用xpath简单爬取网站的内容
  12. 单端测序(Single-read)和双端测序(Paired-end和Mate-pair)的关系
  13. Javascript高级编程学习笔记(4)—— JS中的数据类型(2)
  14. 腾讯游戏DBA团队的发展自白
  15. 限制IP远程访问
  16. 图文助你打开MS SQL Serever的ldf和mdf文件
  17. MySQL案例04:Cause: java.sql.SQLException: Could not retrieve transaction read-only status from server
  18. liunx命令大全
  19. file控件选择图片,img即可显示(无需上传)
  20. UEditor使用总结(与SpringMVC整合)

热门文章

  1. k8s vs k3s: 差异解析
  2. 【面试题】JSON.stringify()妙用,你真的知道吗?
  3. Excel 运算符(二):比较运算符
  4. 这次我设计了一款TPS百万级别的分布式、高性能、可扩展的RPC框架
  5. 【java】学习路线13-多态继承
  6. python进阶__struct数据处理详解
  7. awk5个使用场景
  8. linux使用iptables屏蔽ip地址
  9. 编写 bzt 脚本的正确姿势
  10. 云原生之旅 - 2)Docker 容器化你的应用