跟我一起学“仓颉Web”基础编程-Cookie、Session、Token和JWT
·
目录
一、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基础编程有帮助的话,就动动小手,点个免费的赞吧!收到的赞越多,我的创作动力也会越大哦,谢谢大家🌹🌹🌹!!!
更多推荐



所有评论(0)