目录

一、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基础编程有帮助的话,就动动小手,点个免费的赞吧!收到的赞越多,我的创作动力也会越大哦,谢谢大家🌹🌹🌹!!!

Logo

一站式 AI 云服务平台

更多推荐