
Bearer xxx,后端还是提示未登录。
同事又说“那你把 token-style 改一下”,结果 token 长相变了,401 还是没解决。我前阵子给一套 Sa-Token 鉴权做接口标准化时,就把这两个配置混过一次。
后来才彻底想明白:token-prefix 管的是“怎么提交”,token-style 管的是“怎么生成”,它们压根不是一回事。
很多项目做前后端分离后,都会顺手做两件事:
Authorization: Bearer xxx这时候最容易犯的错就是: 把“请求头格式”和“token 内容格式”混在一起配。
结果通常很典型:
Bearertoken-style 之后,问题没有任何改善我一开始就走过一条弯路:
token-styleBearer这不是 Sa-Token 有问题。 本质上是配置职责没分清。
💡 先记住一句话:prefix 是输入协议,style 是输出策略。
token-prefix:解决“前端怎么带 token”如果前端提交的是这种格式:
{
"satoken": "Bearer xxxx-xxxx-xxxx-xxxx"
}后端如果不做处理,Sa-Token 会把 Bearer 当成 token 值的一部分。
这样一来,框架自然匹配不到真实 token,鉴权就会失败。
所以这时候你要配的是:
sa-token:
token-prefix: Bearer它的作用很明确:
这里有个特别容易漏掉的细节:前缀和 token 之间必须有一个空格。
也就是说,正确的是:
Bearer xxxxx不是:
Bearerxxxxxtoken-style:解决“token 长什么样”token-style 跟请求头格式没关系。
它控制的是 Sa-Token 生成 token 时采用哪种风格。
内置常见选项包括:
uuidsimple-uuidrandom-32random-64random-128tik比如你想把默认 uuid 改成 64 位随机串,可以直接这么配:
sa-token:
token-style: random-64这一步只会改变 token 的生成样式。
它不会帮你处理 Bearer,也不会决定前端该怎么传。
如果内置风格都不满意,可以直接重写 SaStrategy.instance.createToken。
@Configuration
public class SaTokenConfigure {
@PostConstruct
public void rewriteSaStrategy() {
SaStrategy.instance.createToken = (loginId, loginType) -> {
return SaFoxUtil.getRandomString(60);
};
}
}这时候你做的是“生成策略定制”。
和 token-prefix 一样,仍然不是一个层面的问题。
我现在更推荐把这件事拆成两步做,职责非常清楚。
如果你希望接口对接更标准,建议直接统一成:
sa-token:
token-name: Authorization
is-read-header: true
is-read-cookie: false
token-prefix: Bearer前端统一拦截器注入:
axios.interceptors.request.use((config) => {
const token = localStorage.getItem('token');
if (token) {
config.headers.Authorization = `Bearer ${token}`;
}
return config;
});然后用命令先自测一遍:
curl http://localhost:8080/user/info \
-H "Authorization: Bearer 这里替换成真实token"这样你能很快确认一件事: 后端到底是“没收到”,还是“收到了但没识别”。
如果你只是觉得默认 uuid 太长,或者不符合团队习惯,先用内置风格就够了。
sa-token:
token-style: random-64我自己的经验是:
uuid 或 simple-uuidrandom-64先把协议跑通,再追求个性化。
这个坑很多人第一次都会踩。
因为 Cookie 里不能存空格字符。
而 Bearer xxx 中间偏偏就有一个空格。
所以你一旦配了 token-prefix,Cookie 模式就可能直接失效。
如果你确实还要继续走 Cookie,可以再加:
sa-token:
cookie-auto-fill-prefix: true它的作用是: 在 Cookie 模式下自动补齐提交前缀。
token-style 当成 Bearer 兼容开关Bearer xxx,后端仍然未登录token-prefix=Bearer这个误会最常见。
因为两个配置名字里都有 token,看起来很像一类功能。
BearerxxxxxBearer xxxxx这个空格不是装饰,是协议的一部分。
cookie-auto-fill-prefix=true,或者直接禁用 Cookie 读取如果项目本来就是前后端分离,我更建议直接走 Header。 这样链路更透明,排查也简单。
这个问题文档里其实已经点得很明确了。 你改的是“新 token 的生成规则”,不是“把历史 token 批量重写”。
如果是标准前后端分离项目,我现在基本固定这套配置:
sa-token:
token-name: Authorization
is-read-header: true
is-read-cookie: false
token-prefix: Bearer
token-style: random-64
timeout: 2592000这套方案的好处很直接:
🚀 这也是我现在最推荐的一套默认组合。
如果你必须兼容 Cookie,再按需补:
sa-token:
cookie-auto-fill-prefix: true别把所有模式揉在一起配。 认证链路最怕的不是功能少,而是职责不清。
👇 最后提炼 3 条我认为最值钱的认知:
token-prefix 解决的是“请求如何提交”,token-style 解决的是“token 如何生成”。如果你最近也在折腾 Sa-Token,先别急着改一堆配置。 先问自己一句:
你现在要解决的,到底是“前端怎么带”,还是“后端怎么造”?
参考文档:
相关文章推荐:
如果这篇文章帮到了你,不妨点个分享给同样需要的朋友吧! 你的每一次支持,都是我持续创作的动力!💪