基于token的登录验证
基于token的登录验证
token(令牌)
-
原理:
-
登录流程:
-
访问流程:
实现
下述代码的实现基于springboot
用户数据主要存储在mysql数据库的user表中
dao层使用了springdata jpa
1. Redis数据库 存储token
登录的信息仅需一个key-value,如果直接使用关系型数据库进行存储,则需要再建一个数据库表。而redis是非关系型数据库,本身就支持简单的key-value类型的数据。再加上,如果数据库挂了或关闭了,里面的数据都会被自动序列化到本地文件中。
-
创建redis容器
docker pull redis docker run -di --name=redis -p 6379:6379 redis #或 docker run -di --name=redis -net=host redis #将容器的所有端口映射到宿主机中对应的端口
-
测试
进入redis容器docker exec -it redis /bin/bash
使用redis提供的客户端(
redis-cli
)登录redis,该客户端所在路径是/usr/local/bin
cd /usr/local/bin #启动,-h后面跟的是redis所在服务器的ip redis-cli -h 127.0.0.1 -p 6379 #也可以直接写redis-cli,它默认连接本机的端口为6379的redis
输入命令:
ping
,返回pong
则代表连接redis成功 -
基本使用
redis默认有16个数据库,默认为0号数据库,每一个数据库都是独立的相互不影响。#切换数据库(切换为1号数据库) select 1 #存储数据 set key "value" set key value #获取数据 get key #删除数据 del key
-
代码实现
-
项目中导入redis客户端依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
-
配置redis(配置文件application.properties/application.yml)
spring.redis.database:0 #redis的0号数据库 spring.redis.host:redis所在的ip spring.redis.port:6379 #redis端口号默认6379
-
测试
//注入redis客户端 @Autowired private StringRedisTemplate redisTemplate; void test() { //添加key为name,value为lisi的数据,该数据6秒后过期 /** * 参数1:key值 * 参数2:value值 * 参数3:过期时间 * 参数4:时间单位 */ redisTemplate.opsForValue().set("name","lisi",6, TimeUnit.SECONDS); //从数据库中获取对应key的value String value = redisTemplate.opsForValue().get("name"); System.out.println(value); Thread.sleep(6_000); value = redisTemplate.opsForValue().get("name"); System.out.
-