跟我一起学“仓颉Web”基础编程-Cookie、Session、Token和JWT
目录一、Cookie二、Session三、Token四、JWT五、关系六、Cookie案例七、小结一、CookieCookie浏览器自带的小型文本存储大小约 4KB。服务器通过响应头Set-Cookie发给浏览器浏览器自动保存、自动携带到下一次请求用途存登录态、跟踪用户、个性化配置等特点跨请求、跨页面持久但不安全、大小有限Cookie 只是存储载体不是登录机制二、SessionSession服务器内存 / 数据库里保存的用户会话。登录成功后服务器生成一个唯一sessionId把sessionId存在 Cookie 里发给浏览器后续请求浏览器自动带sessionId→ 服务器查表 → 认出你是谁三、TokenToken一串代表身份的字符串服务器不存储只负责验证。登录成功后服务器直接生成一串加密字符串给客户端客户端自己存localStorage / Cookie每次请求手动带上 Token服务器拿到 Token → 解密 / 验签 → 认出你是谁特点无状态、跨域友好、移动端友好四、JWTJWT(JSON Web Token)一串代表身份的字符串服务器不存储只负责验证。登录成功后服务器直接生成一串加密字符串给客户端客户端自己存localStorage / Cookie每次请求手动带上 Token服务器拿到 Token → 解密 / 验签 → 认出你是谁特点无状态、跨域友好、移动端友好五、关系特点CookieSessionTokenJWT存储位置浏览器服务器客户端客户端是否需要服务器不需要需要不需要不需要跨域能力受限制很差强极强移动端支持情况一般差好极好性能轻费服务器轻轻安全性低中高高依赖关系独立使用依赖Cookie不依赖Cookie不依赖Cookie典型场景记住密码早期网站登录APP、第三方登录前后端分离、微服务1Token 和 JWT 是什么关系JWT是TokenToken不一定是JWT也可以是随机字符串JWT 标准化、自包含、可携带信息的 Token2Session 和 Token 最大区别Session服务器存状态有状态Token服务器不存状态无状态无状态 水平扩展强 适合分布式、微服务、跨域3JWT 必须存在 localStorage 吗不是。 JWT 可以存在localStorageCookie内存存在 Cookie 里更安全可加 HttpOnly 防 XSS4Cookie 安全吗不安全容易被XSS 窃取CSRF 伪造所以现代方案会用JWT HttpOnly Cookie或 Token 签名5选择指南早期网站、不用跨域→ Session Cookie前后端分离、微服务→ JWTAPP、小程序→ 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, password123456) httpContext.responseBuilder.header(content-type, text/html;charsetutf-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;charsetutf-8) httpContext.responseBuilder.body(获取Cookie) } }运行结果七、小结本章为大家详细的介绍了仓颉Web开发中Cookie、Session、Token和JWT的内容下一章为大家介绍文件上传与下载的内容。最后创作不易如果大家觉得我的文章对学习仓颉Web基础编程有帮助的话就动动小手点个免费的赞吧收到的赞越多我的创作动力也会越大哦谢谢大家