栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1031591.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号