
我最近把一套 Sa-Token 鉴权从传统 Web 改成前后端分离时,就踩了这坑。 这篇不讲空话,只讲可落地方案:不靠 Cookie,照样把登录态跑稳。
传统 Web 鉴权有两个“天然能力”:
但在 App、小程序、前后端分离场景里,这两个能力经常不存在。 所以你必须自己完成两件事:
核心结论:无 Cookie 模式不是“不能鉴权”,而是“从自动提交改成手动提交”。
Sa-Token 默认能从多个位置读 Token(Header、Cookie、Body)。 前后端分离建议走 Header,链路最清晰。
后端登录成功后,拿到 tokenName + tokenValue 返回前端。
前端存储这两个值,请求时放入 Header:{tokenName: tokenValue}。
后端就能正常识别登录态。
@PostMapping("/user/doLogin")
public SaResult doLogin(@RequestBody LoginDTO dto) {
Long userId = userService.checkLogin(dto.getUsername(), dto.getPassword());
StpUtil.login(userId);
SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
// tokenInfo 里含 tokenName / tokenValue
return SaResult.data(tokenInfo);
}const res = await axios.post('/user/doLogin', form);
const { tokenName, tokenValue } = res.data.data;
localStorage.setItem('tokenName', tokenName);
localStorage.setItem('tokenValue', tokenValue);axios.interceptors.request.use((config) => {
const tokenName = localStorage.getItem('tokenName') || 'satoken';
const tokenValue = localStorage.getItem('tokenValue');
if (tokenValue) {
config.headers[tokenName] = tokenValue;
}
return config;
});sa-token:
token-name: satoken
is-read-header: true
is-read-cookie: false
timeout: 2592000# 1. 登录拿 token
curl -X POST http://localhost:8080/user/doLogin \
-H "Content-Type: application/json" \
-d "{\"username\":\"neo\",\"password\":\"123456\"}"
# 2. 带 token 调受保护接口
curl http://localhost:8080/user/info \
-H "satoken: 这里替换成上一步返回的tokenValue"/doLogin 成功,/user/info 401tokenValue,没存 tokenName,环境改过 token-name 后直接失配tokenName + tokenValue,动态组装 Headersatoken 被过滤🚀 我在项目里固定这套约定:
tokenName/tokenValueis-read-cookie=false这套跑通后,H5、管理后台、小程序都能复用一套鉴权模型。
参考文档:
相关文章推荐:
如果这篇文章帮到了你,不妨点个分享给同样需要的朋友吧! 你的每一次支持,都是我持续创作的动力!💪