奇安信面经(一面Java,已凉)-2022.9.08
投递的是服务端开发工程师岗位。
面试官十分和蔼,比较专业,问的问题和回答让我比较心服。
流程:
- 自我介绍:姓名+专业+研究方向+科研项目+竞赛项目+生活运动+同学氛围和睦
- 谈及项目:
- 该项目的背景是什么?面向的用户是哪些?数据是如何采集获取的?
- 啊吧啊吧
- 巴拉巴拉
- 吭哧吭哧
iv. 看到Spring Gateway,你将其用于用户认证和负载均衡,那么用户认证是怎么实现的?负载均衡是怎么实现的?
以下内容非我的最初回答,我回答出一部分,现在的是我回顾后的步骤。
- 负载均衡:当用户请求来,首先通过spring gateway,通过URL路径配置,这些路径配置被卸载application.properties中,可将请求分配到不同的微服务中去
- 用户认证:用户请求首先经过Spring Gateway, 在这里配置了两个URL的规则,若是内部的url,则不允许外部访问;若是异步的api请求,校验用户必须登录。用户是否登录由token解析出的id是否存在redis进行判断。因为在登录时会生成token,该token由JWT工具生成,在私有部分包含用户名和用户Id。并在登陆后,会将token返回前端。前端在请求时会将token存入request的header一并带上,因此在用户请求来时,取出request中的token,解析该token,获得用户id,若redis中没有该id,则说明还未登录。非空,则说明已登陆过。
- 验证码发送:手机号码+短信登录流程。在项目中有SMS微服务,整合了阿里云的短信服务,在后端首先根据手机号判断是否已存验证码,若已存则直接返回该验证码,因为其的有效时间还没过。若不存,说明还未生成验证码。那么后端生成验证码,然后调用client向阿里云的短信服务发送请求,阿里云的短信服务会根据client所发送的参数给对应的手机发送验证码,若发生成功,则以手机号-验证码为key-value存入redis。然后用户点击登录,再进行验证码的判断。
- 登录判断:首先校验参数,手机号是否为空,是否能根据手机号从redis中取出验证码,若能。则判断手机号是否以及被使用,若已使用则提示。若未使用且验证码正确,则调用JWT工具,将用户名和用户id生成token,并存入map,该map存放着用户名和token。并将该map存入统一返回对象的数据域中。
- 微信登录,用户通过扫码,向后台发送登录请求,那么后台会使用httpclient,使用OAuth2向微信开放平台请求微信OAuth2授权登录,然后开放平台会向微信用户请求确认登录,用户确认后,开发平台会拉起或重定向到后台,并带上临时的code。后台收到code后,加上appid和app secret换取向开发平台换取access_token,后台获得用户的access_token后,可向开发平台请求用户信息,包括用户名和openId。在根据openId查询数据库是否存在该用户,若有则获取该用户后,根据用户Id和用户名生成token,存入redis。之后就是继续用户认证的流程。
- 现有一张用户表,表中有用户信息与学院信息,能否使用MyBatis的特性,直接将一张表中字段映射为两个对象,映射为用户信息和学院信息。
我不知道呀,我只知道首先映射为用户对象,若想从其中抽出学院对象,可用BeanUtils.copyProperties方法,复制属性。在此纠缠了好久,我尽力回答,最后还是不会。
该问题我到现在也还没解决,容我搜索资料再回顾。
4. 看到框架,你觉得你比较对框架比较熟悉的内容有哪些?- 答:(我淦,这是给自己表现机会呀,铁定要抓住)我常用spring全家桶,比较熟悉spring的自动装配机制,bean的生命周期等(我该吧SpringMVC也给加上)。
- 问:还有吗?
- 答:我也了解了一下数据库,如数据库的底层索引,事务隔离级别,redis缓存等
- 问:说到索引,那MySQL的索引是什么结构?
- 答:B+树,B+树的叶节点存储的是数据地址,非叶节点存储的是主索引和辅助索引。且叶节点用一个单链表连接。
- 问:B+树本身具有什么性质?
- 答:B+树其自身是一个二叉平衡搜索树,其查找过程类似与一个二分搜索。(此处,我对B+树的了解到此为止,还需继续深入对B+树的理解)
- (对不起,这块内容我属实忘记了)我思考了一会,对不起,面试官,这块内容我忘记了。(哭唧唧,必须好好回顾项目!!)
- 面试官部门,工作,工作感受如何。
面试内容就到此为止了。经过本次面试和之前的面试,mybatis,常客。我需要好好整理学习。项目的用户登录流程(手机号码+验证码;微信登陆)的流程需要重新回顾,各个插件的集成也需要再次回顾。
总之,需要再回顾项目的流程!!。
最后,希望大家都有一个美好的未来。