目录
一、Cookie
二、Session
三、Token
四、JWT
五、关系
六、Cookie案例
七、小结
一、Cookie
Cookie:浏览器自带的小型文本存储,大小约 4KB。
- 服务器通过响应头
Set-Cookie发给浏览器 - 浏览器自动保存、自动携带到下一次请求
- 用途:存登录态、跟踪用户、个性化配置等
- 特点:跨请求、跨页面持久,但不安全、大小有限
Cookie 只是存储载体,不是登录机制!
二、Session
Session:服务器内存 / 数据库里保存的用户会话。
- 登录成功后,服务器生成一个唯一
sessionId - 把
sessionId存在 Cookie 里发给浏览器 - 后续请求浏览器自动带
sessionId→ 服务器查表 → 认出你是谁
三、Token
Token:一串代表身份的字符串,服务器不存储,只负责验证。
- 登录成功后,服务器直接生成一串加密字符串给客户端
- 客户端自己存(localStorage / Cookie)
- 每次请求手动带上 Token
- 服务器拿到 Token → 解密 / 验签 → 认出你是谁
特点:无状态、跨域友好、移动端友好
四、JWT
JWT(JSON Web Token):一串代表身份的字符串,服务器不存储,只负责验证。
- 登录成功后,服务器直接生成一串加密字符串给客户端
- 客户端自己存(localStorage / Cookie)
- 每次请求手动带上 Token
- 服务器拿到 Token → 解密 / 验签 → 认出你是谁
特点:无状态、跨域友好、移动端友好
五、关系
| 特点 | Cookie | Session | Token | JWT |
| 存储位置 | 浏览器 | 服务器 | 客户端 | 客户端 |
| 是否需要服务器 | 不需要 | 需要 | 不需要 | 不需要 |
| 跨域能力 | 受限制 | 很差 | 强 | 极强 |
| 移动端支持情况 | 一般 | 差 | 好 | 极好 |
| 性能 | 轻 | 费服务器 | 轻 | 轻 |
| 安全性 | 低 | 中 | 高 | 高 |
| 依赖关系 | 独立使用 | 依赖Cookie | 不依赖Cookie | 不依赖Cookie |
| 典型场景 | 记住密码 | 早期网站登录 | APP、第三方登录 | 前后端分离、微服务 |
1)Token 和 JWT 是什么关系?
- JWT是Token
- Token不一定是JWT(也可以是随机字符串)
JWT = 标准化、自包含、可携带信息的 Token
2)Session 和 Token 最大区别?
- Session:服务器存状态(有状态)
- Token:服务器不存状态(无状态)
无状态 = 水平扩展强 = 适合分布式、微服务、跨域
3)JWT 必须存在 localStorage 吗?
不是。 JWT 可以存在:
- localStorage
- Cookie
- 内存
存在 Cookie 里更安全(可加 HttpOnly 防 XSS)
4)Cookie 安全吗?
不安全,容易被:
- XSS 窃取
- CSRF 伪造
所以现代方案会用:
- JWT + HttpOnly Cookie
- 或 Token + 签名
5)选择指南
- 早期网站、不用跨域→ Session + Cookie
- 前后端分离、微服务→ JWT
- APP、小程序→ Token / JWT
- 需要跨域、多服务器共享登录→ JWT
以上是经验之谈,实际使用还是要实事求是!
六、Cookie案例
核心代码
package WebStudy import stdx.net.http.* main() { // 创建Server对象,开始服务 let server = ServerBuilder().addr('127.0.0.1').port(8080).build() server.distributor.register('/setCookie', setCookie()) server.distributor.register('/getCookie', getCookie()) println('设置Cookie: http://localhost:8080/setCookie') println('获取Cookie: http://localhost:8080/getCookie') server.serve() } // 向浏览器里面设置Cookie public func setCookie(): FuncHandler { return FuncHandler { httpContext => httpContext.responseBuilder.header('Set-Cookie', 'username=钝子生') httpContext.responseBuilder.header('Set-Cookie', 'password=123456') httpContext.responseBuilder.header('content-type', 'text/html;charset=utf-8') httpContext.responseBuilder.body('设置Cookie') } } // 从浏览器里面获取Cookie public func getCookie(): FuncHandler { return FuncHandler { httpContext => // 获取响应头 let headers = httpContext.request.headers // 获取Cookie let headerCookies = headers.get('cookie') if (headerCookies.size > 0) { for (headerCookie in headerCookies) { let cookie = headerCookie.split(';') for (item in cookie) { let cookieParam = item.split('=') if (cookieParam.size == 2) { println('name: ${cookieParam[0].trimAscii()}, value: ${cookieParam[1].trimAscii()}') } } } } httpContext.responseBuilder.header('content-type', 'text/html;charset=utf-8') httpContext.responseBuilder.body('获取Cookie') } }运行结果
七、小结
本章为大家详细的介绍了仓颉Web开发中Cookie、Session、Token和JWT的内容,下一章为大家介绍文件上传与下载的内容。最后,创作不易,如果大家觉得我的文章对学习仓颉Web基础编程有帮助的话,就动动小手,点个免费的赞吧!收到的赞越多,我的创作动力也会越大哦,谢谢大家🌹🌹🌹!!!