中医汉英语料库资源平台:实现用户状态信息的保存(是否是登录状态)
token实现思路 1.用户登录校验,校验成功后就返回Token给客户端。 2.客户端收到数据后保存在客户端 3.客户端每次访问API是携带Token到服务器端。 4.服务器端校验token状态。
服务端使用redis保存用户token状态,存储的key-value是:
key:userId + "_token"
value:token字符串
token字符串生成用的是UUID类,根据机器和时间生成唯一字符串
首先先编写服务端生成token代码:
/*
*生成token
* @param userId
* @return token
*/
public String createToken(String userId){
//根据机器和时间生成唯一字符
UUID uuid = UUID.randomUUID();
String token = userId + "_" +uuid.toString().replace("-",""); //token = userId_uuid(没有-符号的uuid)
String key = userId + "_token";
//redis set操作:key,value,时间 2,单位小时
System.out.println(redisTemplate);
redisTemplate.opsForValue().set(key,token,2, TimeUnit.HOURS);
return token;
}
利用UUID类,根据机器和时间生成唯一字符,redisTemplate是SpringBoot下用来操作redis数据库的,生成了唯一token之后,将键值对key-value通过set()方法插入数据库,设置过期时间为2小时,这个以后也可以更改,根据业务需求。
然后还写了hasToken()方法来判断redis里是否有该token,方便快速判断用户是否已经登录,如果没有则用户未登录:方法如下
/*
*检查是否含有token
* @param userId
* @return true 存在 false 不存在
*/
public boolean hasToken(String userId){
String key = userId + "_token";
String r_token = redisTemplate.opsForValue().get(key).toString();
if(r_token != null && r_token.length() != 0){ //token存在,说明用户已经登录
return true;
}
return false;
}
checkToken()方法:检查token是否匹配,如果匹配,则可以更新token状态,例如重新设置两小时的过期时间,如果不匹配,返回错误false:方法如下
/*
*检查token是否匹配
* @param token
* @return true:更新token;false:不存在
*/
public boolean checkToken(String token){
if (token == null || token.equals("")) //token为空
return false;
String[] arr = token.split("_");
if(arr.length != 2) //格式不对
return false;
try {
String key = arr[0] + "_token";
String r_token = redisTemplate.opsForValue().get(key).toString(); //读取数据库里的token
if(r_token == null || !r_token.equals(token)) //数据库里的token过期或者不相等
return false;
redisTemplate.opsForValue().set(key,token,2,TimeUnit.HOURS); //更新token
return true;
}catch (Exception e){
System.out.println(e);
}
return false;
}
最后是clearToken()方法:用来删除已存在的token信息,比如在用户退出浏览器时,或者其他条件下,服务端主动删除redis里面已经存在的token信息。方法如下:
/*
*移除token
* @param token
* @return true 成功; false :失败
*/
public Boolean clearToken(String token){
if(token == null || token.equals("")) //token参数为空
return false;
String[] arr = token.split("_");
if(arr.length != 2) //格式不对
return false;
try {
String key = arr[0] + "_token";
String r_token = redisTemplate.opsForValue().get(key).toString(); //读取数据库里的token
if(r_token == null || !r_token.equals(token)) // 过期或者不相等
return false;
redisTemplate.delete(key);
return true;
}catch (Exception e){
System.out.println(e);
}
return false;
}
然后在用户实现登录功能的时候,服务端会给客户端传送code+msg+data,其中data就包含token信息,客户端收到服务端发送的token信息之后,会在本地cookies存下该token串,然后在发送请求查询时数据会带上token,服务端实现验证,即可。例如,登录的时候:这里还需要判断是否有重复登录的情况,需要用到上面写的checkToken方法,先放一个小的demo,具体之后再实现。
@PostMapping("/login")
public Result<Dtoken> login(@RequestBody UserInfo userInfo) {
UserInfo user=userInfoService.login(userInfo);
System.out.println(user);
if(user.getName()==null){
return Result.error();
}
Dtoken dtoken = new Dtoken();
if(user != null){ //登陆成功生成token并保存在token
String token = tokenService.creatToken(user.getName());
dtoken.setToken(token);
dtoken.setIsLogin(true);
dtoken.setUserInfo(user);
}
System.out.println(dtoken.getUserInfo()+" " +dtoken.getIsLogin() +" " +dtoken.getToken());
return Result.success(dtoken);
}
以上就是利用redis存储用户登录状态信息的具体实现。
再附加一个springboot配置redis数据库的信息:
在application.properties文件里面:添加你所需要的配置信息,如果没有密码最好不要写password那个属性,不要问我为什么,因为之前调试了很久都没有连上数据库,原因竟是我写的spring.redis.password = (空)我没写,但是一直报错,不过后来删掉之后调试成功。