前几天面试Java,发现有三个人,他们的简历上都写了同样的一个项目。
这个项目就是做了一个基于redis和session的登录方案。
但是针对这个登录模块,我就问了3个问题。
这三个学生,只有一个同学回答得大差不差,其他两个同学都没答上来。
这三个问题分别是:
1、你为什么用基于redis和session的方案,而不用基于分布式的jjwt方案?
2、服务端的控制和客户端的控制的区别是什么?
3、你知道SSO的这个名词吗?
还有一个彩蛋问题是:
在基于服务端的这种方案下,怎么实现多项目的退出?
第一个问题,这三个同学用的方案基于session,前后端不分离。
我很奇怪,为什么到现在还在用前后端不分离呢?
尤其这个项目的流量比较大。
有个同学说没有办法,因为学的这个项目就是这么写的。
那就证明这个项目有年代了,可能有10年之久了。
因为只有10年前的项目才是所谓的前后端不分离,就是MVC的年代。
我就继续问那个同学是否知道分布式的jjwt的方案。
他说他听过。
那为什么不用这种方案呢?
他说他的项目本身就是全站的,就是前后端不分的,所以没有办法用token的模式。
于是我继续问了第二个问题。
第二个问题,有两个学生都想了半天,说没什么区别。
在服务器端可以通过session去控制它,在客户端也可以从token来判断然后去控制它。
我说如果没什么区别,那就不用去做两种方案了。
显然是第二种方案更简单。
在服务器端的控制,它更复杂。
因为如果想做多台服务器之间的session共享,就要把它取出来然后放在redis里面。
但如果是基于token的,不管多少服务器,因为是在客户端存储,客户端拿着token过来,做个验证通过了就好了。
第三个问题,我问他们知道什么叫SSO吗?
这三个同学里面没有一个知道的。
SSO叫单点登录。
举个例子,比如说我们登录淘宝或者美团的网站,我们可能通过它们去淘票票或者什么其他的业务上。
看着是在一个网站上,但实际上它后面有很多服务器。
就是前端集成了,在一个业务上登录的时候,在其他业务上也能实现登录。
这就是把登录的这个项目独立出来,所有的项目都会去使用他的登录场景。
他们说这好像跟他们基于redis的方案很像。
我说这个意思大概是这个样子。
但是你做的时候,还没到多项目的级别。
你只是考虑在单个业务流量很大的情况下,把它变成了两台服务器或三台服务器的方式。
这个跟SSO还是有区别的。
最后的彩蛋场景题。
在基于服务端的这种方案下,怎么实现多项目的退出?
同学说这不是很简单吗,直接就在网上点个退出,然后这边把清掉,就退出了。
我说这个是你单个项目的时候。
我现在说的多个项目,使用单点登录的模式来实践。
如果每次都要去访问中央的登录接口,性能压力就太大了。
如果用户已经点退出了,但其他的显示的还是登录的状态,用户就会觉得这个程序有bug。
有个同学经过我的引导,灵机一动,说可以用消息队列。
用生产者消费者形式,然后给每一个服务器发通知,让它们知道这个东西要退出。
这个思路是对的,必须要发通知,但是用消息队列就不要再扯什么生产者消费者。
但这个问题很简单,直接HP请求一个消息毁掉就好了,不用考虑到消息队列。
现在很多学生都存在这样的问题。
背了很多东西,但可能没有地方去发泄。
所以在面试官提问的时候,就喜欢都说。
说多错多,本来面试官可能没想去问,但说得越多面试官想问得就越多。
这是大厂校招的一个特点。
比如这个同学的回答,那大厂面试官就会去问关于生产者消费者的问题。
所以同学们要记住,写在自己简历里的项目,一定要非常熟悉。
至少自己的回答如果遭到面试官的追问是能说出所以然的。
不然就是纯粹给自己挖坑。
迷茫很久也看过各式各样的答案,选不出一条自己的路真的很焦灼。没有想到原来大家的路也是一样的颠簸。