【SDU项目实训2019级】客户端服务端实现token保存用户状态信息(redis数据库)

中医汉英语料库资源平台:实现用户状态信息的保存(是否是登录状态)

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 = (空)我没写,但是一直报错,不过后来删掉之后调试成功。

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值