redis在springboot应用模拟登陆

redis在springboot应用模拟登陆

配置

 redis:
    host: 192.*.*.*
    port: 6379
    database: 4
    password:
    timeout: 5s #连接超时时间
    jedis:
      pool:
        maxActive: 100 #连接池最大连接数(使用负值表示没有限制)
        maxWait: 3s #连接池最大阻塞等待时间(使用负值表示没有限制)
        maxIdle: 100 #连接池中的最大空闲连接
        minIdle: 0 #连接池中的最小空闲连接

代码

@Component
public class TokenManager {

    private static long timeout = 0;
    @Resource
    private StringRedisTemplate redis;

    @Value("${project.token}")
    public void setTimeout(long timeout) {
        TokenManager.timeout = timeout;
    }

    /**
     * 生成token
     */
    public AccessToken createToken(User user, String platform) {
//        deleteTokenByUserId(userId);//单点登录
        //使用uuid作为源token
        String token = UUID.randomUUID().toString().replace("-", "");
        AccessToken model = new AccessToken();
        model.setToken(token);
        model.setUserId(user.getId());
        model.setRoleId(user.getRoleId());
        model.setOrgCode(user.getOrgCode());
        model.setLevel(user.getLevel());
        model.setPlatform(platform);
        //存储到redis并设置过期时间
        redis.boundValueOps(token).set(JSON.toJSONString(model), timeout, TimeUnit.HOURS);
        redis.boundValueOps(user.getId() + "").set(token, timeout, TimeUnit.HOURS);
        return model;
    }

    /**
     * 检查token是否有效
     */
    AccessToken checkToken(String token) {
        if (token == null || token.isEmpty()) return null;
        String str = redis.boundValueOps(token).get();
        if (str == null) return null;
        AccessToken model = JSON.parseObject(str, AccessToken.class);
        //如果验证成功,说明此用户进行了一次有效操作,延长token的过期时间
        redis.boundValueOps(token).expire(timeout, TimeUnit.HOURS);
        redis.boundValueOps(model.getUserId() + "").expire(timeout, TimeUnit.HOURS);
        return model;
    }

    /**
     * 获取token
     */
    public AccessToken getToken(String token) {
        AccessToken result = new AccessToken();
        if (token == null || token.isEmpty()) return result;
        String str = redis.boundValueOps(token).get();
        if (str == null) return result;
        return JSON.parseObject(str, AccessToken.class);
    }

    /**
     * 清除token
     */
    public void deleteToken(String token) {
        if (token == null || token.isEmpty()) return;
        String str = redis.boundValueOps(token).get();
        if (str == null) return;
        AccessToken model = JSON.parseObject(str, AccessToken.class);
        redis.delete(token);
        redis.delete(model.getUserId() + "");
    }

    /**
     * 根据用户id清除token
     */
    public void deleteTokenByUserId(Long userId) {
        if (userId == null) return;
        String token = redis.boundValueOps(userId + "").get();
        if (token == null) return;
        deleteToken(token);
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值