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

Java Web 开发必须掌握的三个技术:Token、Cookie、Session

参考:https://cloud.tencent.com/developer/news/384758

 

在Web应用中,HTTP请求是无状态的。即:用户第一次发起请求,与服务器建立连接并登录成功后,为了避免每次打开一个页面都需要登录一下,就出现了cookie,Session。

Cookie

Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式。Cookie存储的数据量有限,且都是保存在客户端浏览器中。不同的浏览器有不同的存储大小,但一般不超过4KB。因此使用

Cookie

实际上只能存储一小段的文本信息。

Session

Session是另一种记录客户状态的机制,它是在服务端保存的一个数据结构(主要存储的的SessionID和Session内容,同时也包含了很多自定义的内容如:用户基础信息、权限信息、用户机构信息、固定变量等),这个数据可以保存在集群、数据库、文件中,用于跟踪用户的状态。

客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。

用户第一次登录后,浏览器会将用户信息发送给服务器,服务器会为该用户创建一个SessionId,并在响应内容(Cookie)中将该SessionId一并返回给浏览器,浏览器将这些数据保存在本地。当用户再次发送请求时,浏览器会自动的把上次请求存储的Cookie数据自动的携带给服务器。

服务器接收到请求信息后,会通过浏览器请求的数据中的SessionId判断当前是哪个用户,然后根据SessionId在Session库中获取用户的Session数据返回给浏览器。

例如:购物车,添加了商品之后客户端处可以知道添加了哪些商品,而服务器端如何判别呢,所以也需要存储一些信息就用到了Session。

此时再想一想登陆逻辑, 用户A登陆, 服务端一般会把登陆信息存起来(可以把信息存在 文件里,或存在内存里等等),然后派发出一个加密唯一的 sessionid 来 对应a 用户信息( sessionid ---> a 的登陆信息。)最后服务端通过操作响应头 ,把 sessionid 这个值 通过 cookie 的形式,传输到浏览器端.浏览器端 一般就会保存cookie。 当用户再访问 该服务端的 链接时,都会带着sessionid(随着cookie 传到后端)。 然后服务端 就凭借这个 sessionid 来查看用户的信息,判断当前谁登陆了,是不是登陆状态。

 

Token

使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录。大概的流程是这样的:

客户端使用用户名跟密码请求登录

服务端收到请求,去验证用户名与密码

验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端

客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者数据库里

客户端每次向服务端请求资源的时候需要带着服务端签发的 Token

服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据

APP登录的时候发送加密的用户名和密码到服务器,服务器验证用户名和密码,如果成功,以某种方式比如随机生成32位的字符串作为Token,存储到服务器中,并返回Token到APP,以后APP请求时,凡是需要验证的地方都要带上该Token,然后服务器端验证Token,成功返回所需要的结果,失败返回错误信息,让他重新登录。

对于同一个APP同一个手机当前只有一个Token;手机APP会存储一个当前有效的Token。其中服务器上Token设置一个有效期,每次APP请求的时候都验证Token和有效期。

转载于:https://www.cnblogs.com/zhaoyanhaoBlog/p/11302547.html

相关文章:

  • springBoot测试
  • SpringBoot传参方式
  • Springboot项目自动加载设置
  • SpringBoot项目打包
  • Win10修改字体
  • c언어 database
  • Flex 特效组件
  • project bitnami redmine project manager 4.0.4-1
  • JavaWeb过滤器(Filter)
  • Hadoop 系列(四)—— Hadoop 开发环境搭建
  • hibernate 持久化对象 save
  • 进阶1:基础查询
  • MyBatis 核心配置综述之 ParameterHandler
  • webbrowser
  • maven多模块profiles的石使用
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • [译]前端离线指南(上)
  • Bytom交易说明(账户管理模式)
  • canvas 绘制双线技巧
  • CSS3 变换
  • ES6 学习笔记(一)let,const和解构赋值
  • Java多态
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • python学习笔记-类对象的信息
  • Redash本地开发环境搭建
  • Spring-boot 启动时碰到的错误
  • tensorflow学习笔记3——MNIST应用篇
  • vue--为什么data属性必须是一个函数
  • Vultr 教程目录
  • yii2中session跨域名的问题
  • 包装类对象
  • 规范化安全开发 KOA 手脚架
  • 基于组件的设计工作流与界面抽象
  • 简单数学运算程序(不定期更新)
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 数据结构java版之冒泡排序及优化
  • 鱼骨图 - 如何绘制?
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • 主流的CSS水平和垂直居中技术大全
  • !!java web学习笔记(一到五)
  • # .NET Framework中使用命名管道进行进程间通信
  • (7)STL算法之交换赋值
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (转)编辑寄语:因为爱心,所以美丽
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • .NET Framework .NET Core与 .NET 的区别
  • .net 验证控件和javaScript的冲突问题
  • .net快速开发框架源码分享
  • .net用HTML开发怎么调试,如何使用ASP.NET MVC在调试中查看控制器生成的html?
  • .net中我喜欢的两种验证码
  • .net中应用SQL缓存(实例使用)
  • @RestControllerAdvice异常统一处理类失效原因
  • @我的前任是个极品 微博分析