spring-boot+Redis实现简单的分布式集群session共享 - Go语言中文社区

spring-boot+Redis实现简单的分布式集群session共享


  写在前面:

     首先声明,笔者是一名Java编程届的小学生。前面一直在几家公司里面做开发,其实都是一些传统的项目,对于像分布式啦,集群啦一些大型的项目接触的很少,所以一直没有自己整合和实现过。由于最近几天项目不是很忙,自己又有点时间所以就想自己玩玩。以下的项目全是笔者自己一手搭建起来的,但是由于技术有限可能不是很完美。如果哪位大佬发现问题欢迎在下方批评指正~~

    好了,废话不在多说,我们先从下面这张图开始(ps:由于笔者没画过图,所以还请大家将就这看吧!)

 在这个图中我们可以看出大概的实现流程及方式,下面我们用项目来说明一下。请往下看

1.先看一下我项目的pom文件

2.接下来我们看一下Redis的配置信息,在项目的application.yml里面,由于我配置了多环境,所以我的放在了application-local.yml里面,直接在application.yml里面引入local就行了。

 application.yml里面引入local的配置

3.然后是Redis的操作类,网上很多,我也是在网上找的。

4.然后我们编写测试的model,mapper,service和controller。model和mapper我就不再贴出来了,我们只说service和controller。下面是service的代码。

public Map getList(int page, int size) {
        Map params = new HashMap<>();
        params.put("page", (page - 1) * size);
        params.put("size", size);
        Map map = new HashMap<>();
        map.put("total", testMapper.selectCount(null));
        map.put("list", testMapper.selectList(params));
        return map;
    }

这是一会测试用的获取列表方法。

上图中红框内的就是登录成功后把当前的session放入Redis里面,由于我是简单的测试没用到别的用户信息,所以我是用sessionID做key然后放入的一个UUID并设置它的超时时间,单位为秒,上图也就是设置的30分钟后过期。

5.接下来是controller的测试代码

这是测试列表的接口,上面的@ApiOperation和@ApiImplicitParams注解是swagger-ui的注解它可以直接在页面展示请求接口的参数名称和类型,咱们这次不说swagger-ui,所以我在此就不在多说了。下次有机会单独说一下。

上图中红框内的是我自定义了一些异常的捕获和抛出到页面。由于我们在登录的方法里面把session放入的Redis

6.但是我们在接下来的用户其他请求中怎么验证呢?不可能在每个方法里面都验证一次吧。说到这我相信有的同学已经想到了,对,就是用Filter(拦截器),我们需要定义一个全局的拦截器,请看下边

注意上图代码中的注解,在springboot项目中需要加入上面的注解,下面方法的作用是在项目启动的时候把自定义需要忽略的请求放入Set中。

上面代码中我的注释加的很详细,所以我就不在过多的介绍了。因为我想把这个项目做成前后端分离的,所以我定义了拦截全部非ajax的请求,防止通过url拼接的方式访问系统。

7.接下来我们启动主程序测试一下

可以看到已经启动成功,由于我们拦截了非ajax请求所以下面我们使用postman测试一下

 我们先请求一下获取列表的接口请看下边的返回信息

在看一下我们项目的控制台输出

可以看到接口已经按照我们的逻辑返回信息,那个msg就是我们自定义的异常信息,下面的异常信息就是我们自定义的异常枚举

接下来我们使用错误的账号密码登陆一下看看能不能按照我们的逻辑返回

OK,使用错误的账号密码也可以按我们定义的信息返回,下面我们使用正确的账号和密码登录一下,看看可不可以成功登录

哎呀呀,没有按照我们的预想执行,还抛了一个小小的异常。不过很简单,我们根据抛出的异常信息很容易定位到问题的所在,所以说项目中自定义一些异常信息还是有一定用处的。下面我们把Redis打开在登录一下

 

好了,返回了登录成功的信息,这次我们在访问一下获取列表的接口看一下有没有什么惊喜,下面是刚才没有登录以前访问的返回信息,提示我们登录已过期

 

这次我们在重新访问一次

欧耶,这次是真的可以了。因为我们设置了过期时间为30分钟,所以我们中间不做任何动作的情况下(也就是不在有效时间内访问任何接口),过30分钟以后再访问除登录外的任何接口,都会返回给我们上边那个登录信息已过期的信息。

写在最后:

    到此,这个简单的session共享就完成了,只要用户的浏览器不宕,不管把请求转发到哪个service都可以得到用户的session信息。好了,就这样吧!希望大家一起进步哈。我这也算是抛砖引玉了,欢迎各位大佬的批评和指正~~~~~

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/zhangli_wei0403/article/details/84328218
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-02 09:35:08
  • 阅读 ( 803 )
  • 分类:Redis

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢