sa-token使用(源码解析 + 万字)

本文详细解析sa-token框架中如何利用SaStorage接口存储token,并通过SaResponse接口注入Cookie。核心代码分析了如何设置Cookie并探讨了SaHolder获取Response对象的原理,涉及SaTokenContext、SaManager、SaResponse的实现细节以及SpringMVCUtil的响应获取机制。
摘要由CSDN通过智能技术生成

public void setTokenValue(String tokenValue, int cookieTimeout){

SaTokenConfig config = getConfig();

// 将token保存到[存储器]里

SaStorage storage = SaHolder.getStorage();

// 判断是否配置了token前缀

String tokenPrefix = config.getTokenPrefix();

if(SaFoxUtil.isEmpty(tokenPrefix)) {

storage.set(splicingKeyJustCreatedSave(), tokenValue);

} else {

// 如果配置了token前缀,则拼接上前缀一起写入

storage.set(splicingKeyJustCreatedSave(), tokenPrefix + SaTokenConsts.TOKEN_CONNECTOR_CHAT + tokenValue);

}

// 注入Cookie

if(config.getIsReadCookie()){

SaResponse response = SaHolder.getResponse();

response.addCookie(getTokenName(), tokenValue, “/”, config.getCookieDomain(), cookieTimeout);

}

}

SaStorage是一个接口,set方法是把token存入request对象中。

关键是下面一段:

esponse.addCookie(getTokenName(), tokenValue, “/”, config.getCookieDomain(), cookieTimeout);

这句话利用cookie保存了当前登录用户的token。

谷歌浏览器查看cookie方式:右上角有三个点的按钮 - 设置

image

image

搜索localhost,找到satoken,这就是上面代码中getTokenName()方法的返回值

image

步骤 6 sa-token为什么能获取到response对象?SaHolder的秘密。。。(深挖,看不懂就跳过,没事)

===========================================================

之前我也一直想不通一个问题,sa-token用起来也太方便了吧,就这么一句话,什么都搞定了。我也不需要去关心session,也不要管HttpServletResponse啥的。

秘密就在这:

SaResponse response = SaHolder.getResponse();

SaHolder调用getResponse方法得到SaResponse, 这个SaResponse是一个接口

package cn.dev33.satoken.context.model;

/**

  • Response 包装类

  • @author kong

*/

public interface SaResponse {

/**

  • 获取底层源对象

  • @return see note

*/

public Object getSource();

/**

  • 删除指定Cookie

  • @param name Cookie名称

*/

public void deleteCookie(String name);

/**

  • 写入指定Cookie

  • @param name Cookie名称

  • @param value Cookie值

  • @param path Cookie路径

  • @param domain Cookie的作用域

  • @param timeout 过期时间 (秒)

*/

public void addCookie(String name, String value, String path, String domain, int timeout);

/**

  • 在响应头里写入一个值

  • @param name 名字

  • @param value 值

  • @return 对象自身

*/

public SaResponse setHeader(String name, String value);

/**

  • 在响应头写入 [Server] 服务器名称

  • @param value 服务器名称

  • @return 对象自身

*/

public default SaResponse setServer(St

  • 23
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值