设计思路
1、用户发出登录请求,带着用户名和密码到服务器经行验证,服务器验证成功就在后台生成一个token返回给客户端
2、客户端将token存储到cookie中,服务端将token存储到redis中,可以设置存储token的有效期。
3、后续客户端的每次请求资源都必须携带token,这里放在请求头中,服务端接收到请求首先校验是否携带token,以及token是否和redis中的匹配,若不存在或不匹配直接拦截返回错误信息(如未认证)。
- token管理:生成、校验、解析、删除
- token:这里使用userId_UUID的形式
- 有效期:使用Redis key有效期设置(每次操作完了都会更新延长有效时间)
- 销毁token:删除Redis中key为userId的内容
- token存储:客户端(Cookie)、服务端(Redis)
- Cookie的存取操作(jquery.cookie插件)
- Redis存取(StringRedisTemplate)
实现
【Redis操作类】
package com.bpf.tokenAuth.utils;
import java.util.concurrent.TimeUnit;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
@Component
public class RedisClient {
public static final long TOKEN_EXPIRES_SECOND = 1800;
@Autowired
private StringRedisTemplate redisTpl;
/**
* 向redis中设值
* @param key 使用 a:b:id的形式在使用rdm进行查看redis情况时会看到分层文件夹的展示形式,便于管理
* @param value
* @return
*/
public boolean set(String key, String value) {
boolean result = false;
try {
redisTpl.opsForValue().set(key, value);
result = true;
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* 向redis中设置,同时设置过期时间
* @param key
* @param value
* @param time
* @return
*/
public boolean set(String key, String value, long time) {
boolean result = false;
try {
redisTpl.opsForValue().set(key, value);
expire(key, time);
result = true;
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* 获取redis中的值
* @param key
* @return
*/
public String get(String key) {
String result = null;
try {
result = redisTpl.opsForValue().get(key);
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* 设置key的过期时间
* @param key
* @param time
* @return
*/
public boolean expire(String key, l