HTTP 协议是无状态的。

  • 即服务器对于客户端每次发送的请求都认为它是一个新的请求。
  • 本次请求和上次请求无法判断是不是同一个客户端操作的。

随着 Web 应用的发展,如在线购物网站,需要登录的网站等,马上就面临一个问题,那就是要管理会话,必须记住哪些用户登录了系统,哪些用户往自己的购物车中放了商品, 也就是说必须把每个用户区分开


session 机制

  • session 是一种记录服务器和客户端会话状态的机制。
  • session 主要用来存储所有访问过该服务端的客户端的用户信息(也可以存储其他信息),从而实现保持用户会话状态。
  • session 是基于 cookie 实现的,session 存储在服务器端,sessionid 会被存储到客户端的 cookie 中。

注:cookie 是浏览器访问服务器后,服务器传给浏览器的一段数据(key-value)

cookie 特点:

  • cookie 存放在客户端
  • cookie 有个数限制(不同浏览器的cookie个数不等) ,
  • cookie 大小一般是4K,
  • cookie 可设置失效时间(如果没设置,默认是关闭浏览器时失效),
  • cookie 是不可跨域的(当前域名下有效)。

session 工作流程

  • 浏览器在第一次访问服务器时,服务器会创建一个 session,代表用户的一次会话过程,服务器会为每一个 session 都分配一个唯一的 sessionid,以保证每个用户都有一个不同的session 对象。
  • 服务器在创建完 session 后,同时会创建一个特殊的 cookie(name为JSESSIONID,value为sessionid),并将该 cookie 发送至浏览器端。
  • 当用户向服务器发送新的请求时,浏览器会携带这个 cookie 对象,把 sessionid 传回给服务器,服务器根据 sessionid 找到与该用户对应的 session 对象,从而区分不同用户。

session 登录验证机制

用户在登录认证成功之后,并且往 session 对象里面放入了用户登录成功的凭证,才能用来进行真正意义上的管理会话。

session 机制存在的不足

  • 开销问题:服务端需要保存每个用户的 session 信息,当用户越来越多时,内存的开销也会不断增加;
  • 持久化问题:解决重启服务器后session就消失的问题。在数据库中存储 session,而不是存储在内存中;
  • CORS问题(跨域共享):在服务器A上登录, sessionid 保存在A上,假设下一次请求被转发到服务器B怎么办?会限制了服务器扩展能力;
  • CSRF问题(跨站请求伪造):session 伪造/劫持等安全性问题。

token 验证机制

token 是服务端生成的一串字符串,作为客户端进行请求的一个令牌。

  • token 认证流程:
  • 客户端使用用户名跟密码请求登录
  • 服务端收到请求,去验证用户名与密码
  • 验证成功后,服务端会签发一个 token 并把这个 token 发送给客户端
  • 客户端收到 token ,会把它存储起来,如存放在 cookie 或 localStorage 中
  • 客户端每次向服务端请求资源的时候需要带着服务端签发的 token(注:token 放到 HTTP 请求的 Header 里)
  • 服务端收到请求,然后去验证客户端请求中的 token ,如果验证成功,就向客户端返回请求的数据。

token 验证流程图示

token 验证流程

token 数字签名

token 机制优点

  • 服务端无状态:服务端不存储 token 信息, token 存在客户端中
  • 可扩展性好:不存储 session 信息,负载均衡器能够将用户信息从一个服务传到其他服务器上。
  • 支持跨域访问:CORS(跨域资源共享)
  • 安全性:token 通过HTTP header传送,防止CSRF(跨站请求伪造)
  • 基于标准:如JWT标准。JSON Web Token,最流行的跨域认证解决方案

[JAVA EE]session 和 token 机制相关推荐

  1. [java]关于Session关于Token关于JWT

    目录 关于Session 关于Token 关于JWT 关于Session HTTP协议是一种无状态协议,即:当某个客户端向服务器发起请求,服务器端进行处理,后续,此客户端再次发起请求,服务器端并不能直 ...

  2. IBM WebSphere 开发者技术期刊: 最重要的 Java EE 最佳实践

    级别: 初级 Keys Botzum, 高级技术人员 , IBM Kyle Brown, 杰出工程师, IBM Ruth Willenborg (rewillen@us.ibm.com), 高级技术人 ...

  3. java ee maven_真正释放Maven和Java EE的强大功能

    java ee maven 如果野心和愿景太复杂而无法使用,则它们可能会淘汰伟大的解决方案. 尽管Maven和Java EE是在整个Java行业中都已建立的良好技术,但是使用它们并使用其作者打算使用的 ...

  4. 真正释放Maven和Java EE的强大功能

    如果野心和愿景太复杂而无法使用,那么它们可能会毁灭伟大的解决方案. 尽管Maven和Java EE是在整个Java行业中都已建立的良好技术,但是使用它们并使用其作者希望您使用的所有技术和模式来设计项目 ...

  5. 为什么你学不会递归?告别递归,谈谈我的一些经验 关于集合中一些常考的知识点总结 .net辗转java系列(一)视野 彻底理解cookie,session,token...

    为什么你学不会递归?告别递归,谈谈我的一些经验 可能很多人在大一的时候,就已经接触了递归了,不过,我敢保证很多人初学者刚开始接触递归的时候,是一脸懵逼的,我当初也是,给我的感觉就是,递归太神奇了! 可 ...

  6. Http会话保持机制:Cookie、Session和Token

    前言:在 Web 应用中,用户的认证和鉴权是非常重要的一环.HTTP 是一个无状态的协议,一次请求结束后,下次在发送服务器就不知道这个请求是谁发来的了(同一个 IP 不代表同一个用户),这样就无法确定 ...

  7. 【Java EE (Struts2 + Spring + Hibernate)开发】:Struts2(二)之【拦截器机制】

    [Java EE (Struts2 + Spring + Hibernate)开发]:Struts2(二)之[拦截器机制] 本文地址:http://blog.csdn.net/shanglianlm/ ...

  8. 还分不清 Cookie、Session、Token、JWT?

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 转自:掘金   作者:秋天不落叶 juejin.im/po ...

  9. Java EE开发三剑客现状及发展浅析

    JSF 2.0 尽管 Java 在展示层框架上竞争的非常激烈,但 JSF 仍然固守着自己的领地.虽然有很多关于 JSF 的易用性和健壮性的质疑声,但 JSF2.0 就是为正面解决这些问题而提出来的,它 ...

最新文章

  1. 郑捷《机器学习算法原理与编程实践》学习笔记(第七章 预测技术与哲学)7.1 线性系统的预测...
  2. python 魔法函数 运行时_16个python常用魔法函数
  3. 【Android 界面效果22】Android的Tab与TabHost
  4. Fiddler抓包工具详解(四)(断点设置+弱网测试)
  5. MySQL多元复制_MySQL多源复制解决方案
  6. linux vi命令 置顶,[置顶] Linux vi命令 创建文件
  7. java里dir是什么意思_关于文件系统:为什么user.dir系统属性在Java中工作?
  8. sql server 2005安装需求
  9. object c中 new和alloc区别
  10. 【Python】Tkinter教程
  11. Seurat | 强烈建议收藏的单细胞分析标准流程(细胞周期的影响去除)(三)
  12. 什么叫一层交换机,二层交换机,三层交换机?
  13. 思考犹太家庭如何教育出这么多精英及富豪
  14. 计算机弹薛之谦的音乐,薛之谦最火的五首歌,除了《演员》,这三首歌却埋没3年无人知!...
  15. sql Server STUFF()函数
  16. 立创开源 WCHLink/DapLink下载器 沁恒
  17. 部署harbor并实现https(SAN签发证书)
  18. JAVA毕业设计服装连锁店后台管理系统计算机源码+lw文档+系统+调试部署+数据库
  19. 解读!10篇人机交互领域高引论文合集
  20. 【历史上的今天】11 月 15 日:全球首款商用微处理器;微软进军游戏界;ICQ 诞生

热门文章

  1. Spring中启用Hibernate二级缓存步骤
  2. C++ 笔记(27)— 指针变量、数组和指针、指针数组、数组指针、指针常量与常量指针
  3. 方差协方差以及协方差矩阵
  4. Python多版本pip安装库的问题
  5. Tengine MLOps概述
  6. 使用Runtime执行推理(C++)
  7. NSight Compute 用户手册(下)
  8. 编译器设计-有限自动机
  9. Linux内存技术分析(上)
  10. git 拉去merged 仓库的代码步骤