1.Sa-Token是怎么生成Token字符串的?
以下是我翻源码得到的,算是总结一下基本流程。如有错误欢迎指正!!!
Sa-Token:生成Token令牌的原理: 1.调用他的工具类的login方法,传入用户id;先查看是否配置了允许并发登录, 2.尝试从Session签名记录里取出token,未允许则将其他设备的token标记为下线,若此时还未获取到Token,则通过Sa-Token管理类调用行为框架接口的默认实现类的生成Token的方法,来生成Token字符串。 3.然后获取userId对应的Session,修改Session的到期时间,将Token签名绑定到Session中,将Token值存入当前会话。 注:以上说的session和cookie都是存储在Sa-Token框架的Dao实现类的CurrentHashMap中。
public void login(Object id, SaLoginModel loginModel) {
// ------ 0、检查此账号是否已被封禁
if(isDisable(id)) {
throw new DisableLoginException(loginType, id, getDisableTime(id));
}
// ------ 1、获取相应对象
SaTokenConfig config = getConfig();
SaTokenDao dao = SaManager.getSaTokenDao();
loginModel.build(config);
// ------ 2、生成一个token
String tokenValue = null;
// --- 如果允许并发登录
if(config.getIsConcurrent()) {
// 如果配置为共享token, 则尝试从Session签名记录里取出token
if(config.getIsShare()) {
tokenValue = getTokenValueByLoginId(id, loginModel.getDevice());
}
} else {
// --- 如果不允许并发登录
// 如果此时[user-session]不为null,说明此账号在其他地正在登录,现在需要先把其它地的同设备token标记为被顶下线
SaSession session = getSessionByLoginId(id, false);
if(session != null) {
List<TokenSign> tokenSignList = session.getTokenSignList();
for (TokenSign tokenSign : tokenSignList) {
if(tokenSign.getDevice().equals(loginModel.getDevice())) {
// 1. 将此token 标记为已顶替
dao.update(splicingKeyTokenValue(tokenSign.getValue()), NotLoginException.BE_REPLACED);
// 2. 清理掉[token-最后操作时间]
clearLastActivity(tokenSign.getValue());
// 3. 清理user-session上的token签名记录
session.removeTokenSign(tokenSign.getValue());
// $$ 通知监听器
SaManager.getSaTokenListener().doReplaced(loginType, id, tokenSign.getValue(), tokenSign.getDevice());
}
}
}
}
// 如果至此,仍未成功创建tokenValue, 则开始生成一个
if(tokenValue == null) {
tokenValue = createTokenValue(id);
}
// ------ 3. 获取[User-Session], 续期
SaSession session = getSessionByLoginId(id, true);
session.updateMinTimeout(loginModel.getTimeout());
// 在session上记录token签名
session.addTokenSign(new TokenSign(tokenValue, loginModel.getDevice()));
// ------ 4. 持久化其它数据
// token -> uid
dao.set(splicingKeyTokenValue(tokenValue), String.valueOf(id), loginModel.getTimeout());
// 写入 [最后操作时间]
setLastActivityToNow(tokenValue);
// 在当前会话写入当前tokenValue
setTokenValue(tokenValue, loginModel.getCookieTimeout());
// $$ 通知监听器
SaManager.getSaTokenListener().doLogin(loginType, id, loginModel);
}
2.迪杰斯特拉求最短路径算法思想?
简单总结就是:所有的点都看作一个个石头,然后每条边看作绳子,若求A到其他顶点的最短路径,就先把A拿起,依次离开桌面的石头与A石头绷紧的绳子长度就是最短路径。最后一个离开桌面的石头与A石头之间的最短路径最大。
3.什么是跨域问题?
面试官说是浏览器机制的问题,跨域请求就是:请求地址域名和当前页面域名不一致。
4.回答一下get和post请求的区别?get从服务器获取数据,post向服务器提交数据。
5.Linux的常用命令?