在分布式中,用户的session如何处理呢?
服务器中的原生session是无法满足需求的,因为用户的请求有可能随机落入到不同的服务器中,这样的结果将会导致用户的session丢失,传统做法中有解决方案,是进行session同步,将一个服务器上的session进行同步到另一个服务器上,在一个集群中无论你访问哪个服务器都可以共享,但是这种方法有个明显缺陷,就是性能问题,传输有时延问题,其次这样每台服务器的session重复拥有,这样其内存必然受到影响,如果只有几台服务器还好,如果是十台,二十台服务器呢?这种恐怖的场景会是什么样的体验呢,我就无法得知了。
那么我们应该如何有效的解决这样的问题呢,我们可以使用传说中的token来解决,简单明了的说就是用户每次登陆的时候生成一个类似sessionId的东西(也就是所谓的token,这将是全局的唯一标识,如UUID,作用类似于(jsessionid)),将其写到cookie当中传送给客户端,客户端对数据库访问过程中不断上传这个token,而我们服务端拿到这个token就可以获取用户的在线信息,这个道理其实在很多地方是相通的,比如我们容器中实现原生session,也是将生成的id写入coolie当中。
接下来我会来详细介绍如何在登陆后实现分布式session
1,利用jdk中自带的uuid生成器生成uuid用token来标记名称,并写入cookie通过response传到客户端里,
2。给token设置有效时间,这里我给它设置了两天
3,在登陆的方法里加入cookie
4,通过@cookieValue来注解就可以获取到对应的token,但是需要注意一个问题,一些手机客户端是没用用到cookie来传的,而是直接用参数来传,那也不需要担心,@RequestParam注解一样可以获取,需要给他们一个优先级,先判断是否有参数后判断是否cookie有值
5,创建方法通过token获取user信息,当用户持续在线时,我们可以给他延迟时效。