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方式:右上角有三个点的按钮 - 设置
搜索localhost,找到satoken,这就是上面代码中getTokenName()方法的返回值
步骤 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