2022-07-28Java日常实习生面试总结

本文介绍了Sa-Token框架生成Token的详细步骤,包括检查并发登录配置、从Session中获取或生成Token、更新Session及持久化数据。同时,还概述了迪杰斯特拉算法的思想,将其比喻为石头和绳子的游戏,用于找到最短路径。此外,讨论了跨域问题的定义,HTTP的GET和POST请求的区别,以及列举了一些常用的Linux命令。
摘要由CSDN通过智能技术生成

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的常用命令?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值