type
status
date
slug
summary
tags
category
icon
password
一般情况下,登录存储数据分为两种,一种是使用 session,一种是使用 redis。本文讲解两种流程的特点。
代码仓库: https://github.com/MisteryLiuCode/hm-dianping
使用 session 实现登录注册,最后一个校验登录状态,如果登录成功会把用户放入 ThreadLocal 中,每个用户的请求是一个线程,可以通过这个线程获取登录用户的信息。

遇到的问题
经过上面流程之后,可以进行登录,但是发现登录一闪而过,还需要重新进行登录。这是因为登录接口没有实现校验用户是否登录的功能。
创建一个拦截器,判断用户是否登录,如果登录了就放行,并把用户信息放入 ThreadLocal 中,分发到各个 controller 中。没有登录就跳到登录页面。

集群 session 共享问题
使用 session 会出现共享的问题。每一个 tomcat 都有一个独立的空间,那么他们都有一个共享的 session,如果负载均衡打到不同的tomcat,会误以为用户未登录。session 也提出了解决方案,各个 tomcat 之间可以进行复制。但是也没有火起来,最后采用了 Redis 的方案,集群 tomcat 可以同时访问 redis 里面的内容,自然形成了数据共享。

使用 redis 实现共享 session
登录的时候有两处数据需要放入 redis 里,一个是电话号码和验证码,一个登录成功之后存放 token,并设置有效期。

在拦截器中每次调用接口,会重置用户的token,保证用户如果在一直访问接口就不会过期,但是这个拦截器拦截的是那些需要登录才能使用的接口,如果用户登录完之后访问的那些不需要登录就能访问的接口,比如首页,那么 30 分钟之后依然需要登录。
针对这个问题的解决方案是再加一个拦截器,这个拦截器拦截一切路径,只对 token 做刷新处理,第二个拦截器再对路径进行拦截。

image-20230721141636284