你是如何拿到登陆用户信息的

说到Java web,那么在web端获取登陆用户信息几乎是所有系统都需要实现的功能,下面我们就来讲一下几种获取登陆用户信息的方法。

从session中获取

这是我们刚刚接触Java web时就了解的一种解决方案,配置一个登陆过滤器或者登陆拦截器,在用户登陆的时候将用户信息放到session中,然后控制层在session中取出用户信息,这是最简单也是最常见的一种解决方案。

随着用户量的增大,单部署的服务往往不能满足我们的需求,这时候往往我们会引入集群来分摊服务器的压力。但是引入集群后,从session中存取用户信息就会变得不那么靠谱了。

大家都知道session是存在服务端的,那么如果用户在集群机器A中登陆,用户信息就存储在了机器A上,此时如果用户新的请求被分发到集群机器B上,就无法获取用户信息了。

这是集群情况下用户信息被存储在集群中的单个服务器上导致的,解决方案主要有两种:

让用户后续的所有请求都分发到用户登陆的那台机器

把用户信息存储在缓存中间件中,而不是集群中的每个服务器上

第一种方案可以在代理服务器(apache,nginx等)上配置session黏着,这样就能保证用户后续请求都会被路由到同一台机器上,这就解决了集群情况下拿不到用户信息的问题了。

当然,对ip进行hash算法使某一个用户的请求永远随机到某一台机器上也是一种思路。

从缓存中间件获取

从缓存中间件获取,就是把用户信息存储在缓存中间件中,控制层直接从缓存中间件中获取用户信息。

用户在登陆成功后,会生成一个token,然后以token为键,用户信息为值存储在缓存中间件中,并且把token发送到页面端。

页面端向服务端发送请求的时候带上这个token,服务端控制层可以根据这个token从缓存中间件中获取用户信息。

在集群情况下,用户信息还是存储在一个独立出来的缓存服务器上,这样就可以避免获取不到用户信息的问题了。

以上两种方法就是获取登陆用户信息的两种主要解决方案了,这里再从代码层面上给出一个小分享。

不论是从session中获取还是从缓存中间件中获取用户信息,不可避免的是在控制层需要显式的去获取用户

或者

几乎每个控制层方法都需要执行上面的语句获取一下用户信息,着就会显得很罗嗦,所以下面给出一个小分享来使用注解和HandlerMethodArgumentResolver结合优化控制层代码。

我们先来了解一下HandlerMethodArgumentResolver, SpringMvc中的HandlerAdapter会检测所有的 HandlerMethodArgumentResolver,对参数进行处理和加工。

这样,我们就可以自定义一个HandlerMethodArgumentResolver,读取请求中的token,根据token获取到用户信息,将用户信息通过自定义注解的方式传递到控制层。

没错,这个小分享是基于SpringMVC的,下面给出详细代码。

首先自定义一个注解,用来传递用户信息

自定义一个HandlerMethodArgumentResolver,用来获取用户信息

控制层获取用户信息

通过上面的Logined注解和LoginedArgumentResolver结合,在控制层中需要获取用户信息,只需要在参数中添加@Logined就可以了,是不是简单了很多呢,希望今天的分享可以给大家带来帮助。

虽然每次分享的文章大多数东西都比较基础,大家可能都懂,但是只要文章中有一两个点能给大家带来帮助我就很知足了。公众号刚刚起步,希望大家多多支持,帮忙扩散一下,谢谢。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180716G01CFM00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券