数据接口的访问有时常常和和身份唯一合法验证有关。
1.通过session来控制
1.1 控制方式
传统做法通过session识别身份,具体步骤
- 1、通过过滤器拦截请求,判断用户session是否存在。登陆等模块不需要验证身份的特殊处理。
- 2、通过拦截器拦截方法,判断用户session是否存在,不需要验证登陆加载,通过auth自定义注解区分。此法优于1。
以上两种方法适合简单早期的应用,如遇到应用系统集群,需要解决session共享的问题。又如接口同时提供对外访问。总不能特殊处理再重写一下吧?
1.2 session共享方式
spring boot项目使用tomcat服务器实现session共享的方式,使用redis存储session对象值
(1)添加依赖
<!--使用redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--session 共享 -->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
(2)在yml中配置redis
spring:
redis:
password: 123456
pool:
max-active: 21
max-idle: 8
max-wait: -1
min-idle: 0
sentinel:
master: sentinel-name
nodes: 192.168.1.2:6389,192.168.1.3:6390,192.168.1.4:6387
timeout: 1000
此处配置完全是spring-boot-starter-data-redis相关配置参数,跟spring-session-data-redis无关。后者依赖前者
(3)在项目启动类上添加如下注解@EnableRedisHttpSession
通过@EnableRedisHttpSession注解开启Session共享功能
@Configuration
@EnableRedisHttpSession(maxInactiveIntervalInSeconds= 3600, flushMode = FlushMode.ON_SAVE)
public class RedisCacheConfig
{
}
注解的主要作用是注册一个SessionRepositoryFilter,这个Filter会拦截到所有的请求,对Session进行操作
2.通过请求中携带cookie或者head身份信息
思路一:
- 登陆成功后,服务器产生token(生成规则自定:IP+浏览器类型+时间)令牌,返回到客户端token和用户ID(加密)。服务器把toke 对应的用户信息存放session中。
- 拦截器接收token,通过session从服务器中获取相应的用户信息,如果没有获得(session失效或者服务器不同),则根据用户ID后台自动登录,用户信息再放到session里面。
重点:请求cookie中携带token和id
思路二:
- 登录成功后,服务产生token(生成规则:时间 )令牌,令牌存放在redis缓存并且存放在登录信息表。令牌通过head返回。
- 客户端访问服务器,拦截器接受token,解析token并验证是否过期,从redis读取token