redis在实际项目中的应用 -- 登录成功通过redisUtil.setData存取token

首先保证 redis服务处于启动状态,redis安装和启动步骤参考博客连接:
redis安装和启动步骤:

然后使用Redis Desktop Manager 工具连接服务器的redis:
在这里插入图片描述
上图中,数据库中的 key的数量 为 1

一、在各个服务的配置文件中配置redis

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如果redis设置了密码,别忘记再加上password :

二、Redis工具类 和controller中接收登录请求的方法

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

@Component
public class RedisUtil {
    /**
     * REDIS_ACTIVE_TIME : redis数据存活时间 - 20分钟
     */
    private static final int REDIS_ACTIVE_TIME = 20 * 60;

    /**
     * Redis 操作器
     */

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 设置数据
     *
     * @return true:添加成功;false:添加失败,该值已经存在或其他错误等
     */
    public synchronized boolean setData(String key, Object object) {
        if(getData(key) != null){
            return false;
        }

        redisTemplate.opsForValue().set(key, object, REDIS_ACTIVE_TIME, TimeUnit.SECONDS);
        return true;
    }

    /**
     * 返回指定数据
     * @param key 被查找的数据值
     * @return 返回的被查找的值
     */
    public synchronized Object getData(String key) {
        return key == null ? null : redisTemplate.opsForValue().get(key);
    }

    /**
     * 更新缓存时间
     * @param key 被更新的键值
     * @return true:更新成功;false:更新失败 键值不存在或者已经过期
     */
    public boolean resetActiveTime(String key){
        if(getData(key) == null){
            return false;
        }

        redisTemplate.expire(key, REDIS_ACTIVE_TIME, TimeUnit.SECONDS);

        return true;
    }

    /**
     * 覆盖数据
     * @param key 被覆盖的数据key
     * @param object 新数据值
     * @return 是否成功
     */
    public boolean setOverride(String key, Object object){
        redisTemplate.opsForValue().set(key, object, REDIS_ACTIVE_TIME, TimeUnit.SECONDS);
        return true;
    }

    /**
     * 删除Key 的值
     * @param key 被删除的key
     * @return 是否成功
     */
    public boolean delKey(String key){
        if(getData(key) == null){
            return false;
        }

        redisTemplate.delete(key);

        return true;
    }
}

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 * @author :
 * @ClassName: RedisConfig
 * @Description:
 * @date : 2019/4/25
 */
@Configuration
public class RedisConfig {

    @Autowired
    private RedisConnectionFactory redisConnectionFactory;

    @Bean
    public RedisTemplate<String, Object> redisTemplate(){
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new StringRedisSerializer());
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        return redisTemplate;
    }
}

/**
 * @author : 
 * @ClassName: LoginInterceptor 登陆拦截器
 * @Description:
 * @date : 2019/4/11 2019/4/26
 */
@Deprecated
public class LoginInterceptor{
    /**
     * 生成Token
     *
     * @param userId 用户ID
     * @return 生成的Token
     */
    public static String createUserToken(String userId) {
        Date date = new Date();

        return String.valueOf((userId + date.getTime()).hashCode());
    }
}

Controller接收登录请求:

@ResponseBody
    @PostMapping("userLogin")
    public AppResponse doLogin(@RequestBody(required = false) Map<String, String> params, HttpSession session) throws UnsupportedEncodingException {
        if(params == null || params.size() != 2){
            return AppResponse.bizError("无效请求参数");
        }

        String userAccount = "userAccount";
        String userPwd = "userPwd";

        if(params.containsKey(userAccount)){
            userAccount = params.get(userAccount);
        }else {
            return AppResponse.bizError("无效请求参数");
        }

        if(params.containsKey(userPwd)){
            userPwd = params.get(userPwd);
        }else {
            return AppResponse.bizError("无效请求参数");
        }

        System.out.println(userAccount + userPwd);

        UserInfo userInfo = userService.getUserByAccount(userAccount);

        System.out.println(userInfo);
        if(userInfo == null){
            return AppResponse.bizError("失败");
        }

        if(userInfo.getUserPwd().equals(CreateMD5.getMd5(userPwd))){
            String userId = userAccount;
            String userToken = LoginInterceptor.createUserToken(userId);

            redisUtil.setData(userToken, userId);

            userInfo.setToken(userToken);
            return AppResponse.success("成功", userInfo);
        }else {
            return AppResponse.bizError("失败");
        }
    }

三、存、取token演示:

1.postman发出请求:
在这里插入图片描述
2.Controller处理请求 :
在这里插入图片描述
存token:
在这里插入图片描述

请求成功, 生成token:
在这里插入图片描述
3.再次查看Redis Desktop Manager,果然多了一个键值对:
在这里插入图片描述

获取token(键)对应的值,即为登录用户的userAccount --> admin

4.再对 取token进行测试:
随便访问后台的一个需要验证token的方法:

在这里插入图片描述

/**@Author:
     * @Description:获取所有分类
     * @Date: 2019/4/27
     * @Param:tokenBackend
     */
    @ApiOperation(value = "获取所有分类")
    @ResponseBody
    @GetMapping("/getCategory")
    public AppResponse listCategory(String tokenBackend) throws Exception {
        String userId=(String)redisUtil.getData(tokenBackend);
        if(userId !=null || !userId.equals("")){
            try {

                Tree tree = categoryService.listCategory();
                return AppResponse.success("查询成功", tree.getChildren());
            } catch (Exception e) {

                throw new Exception("获取分类失败,请联系管理员!");
            }
        }else{
            return AppResponse.noPermission("您无权限访问此方法,请登录!");
        }
    }

postman发出请求(注意,这里的参数tokenBackend一定要使用刚才登录生成的token,否则此方法不会被允许访问的):
在这里插入图片描述
后台处理请求:

在这里插入图片描述
成功获取到之前存的那个token

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值