栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

4.4 使用Redis优化登录模块

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

4.4 使用Redis优化登录模块

文章目录

把访问频率比较高,会影响效率的功能使用Redis进行优化使用Redis存储验证码

用户第一次访问登录界面,服务器生成随机字符串保存到cookie里,发送给浏览器,同时生成相应的key保存验证码文本到Redis里 使用Redis存储登录凭证使用Redis缓存用户信息



# 使用Redis优化登录模块 把访问频率比较高,会影响效率的功能使用Redis进行优化 使用Redis存储验证码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cyBCi9TJ-1646574106551)(D:TyporaNotes牛客网论坛项目第三章图片4.7.1.png)]

用户第一次访问登录界面,服务器生成随机字符串保存到cookie里,发送给浏览器,同时生成相应的key保存验证码文本到Redis里

因为用户还未登录,所有无法获取用户信息,因此使用临时凭证作为key来存取信息;用户访问登录页面的时候,先给用户发一个cookie,存储随机生成的字符串,以此字符串作为临时凭证cookie有效时间设置比较短来节省开销,设置为60秒即可;Redis中验证码设置为60秒过期,节省开销;

// 登录验证码
public static String getKaptchaKey(String owner) {
    return PREFIX_KAPTCHA + SPLIT + owner;
}
//生成验证码key保存到cookie
String kaptchaOwner=CommunityUtil.generateUUID();
cookie cookie=new cookie("kaptchaOwner",kaptchaOwner);
cookie.setMaxAge(60);
cookie.setPath(contextPath);
httpServletResponse.addcookie(cookie);
//保存验证码到Redis
String redisKey= RedisKeyUtil.getKaptchaKey(kaptchaOwner);
redisTemplate.opsForValue().set(redisKey,text,60, TimeUnit.SECONDS);
 // 检查验证码
// String kaptcha = (String) session.getAttribute("KaptchaCode");
 String kaptcha=null;
 if(StringUtils.isNotBlank(kaptchaOwner))
 {
     String redisKey=RedisKeyUtil.getKaptchaKey(kaptchaOwner);
     kaptcha =(String) redisTemplate.opsForValue().get(redisKey);
 }
使用Redis存储登录凭证
// 登录的凭证
public static String getTicketKey(String ticket) {
    return PREFIX_TICKET + SPLIT + ticket;
}

把之前的LoginTicketMapper设置为不推荐使用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YCMus558-1646574106552)(D:TyporaNotes牛客网论坛项目第三章图片4.7.2.png)]

//使用Redis来存储登录凭证
String redisKey= RedisKeyUtil.getTicketKey(loginTicket.getTicket());
redisTemplate.opsForValue().set(redisKey,loginTicket);

退出的时候把登录凭证的状态设置为1,在重新放入Redis,没有直接删除,因为需要保存用户登录信息

//退出
public void logout(String ticket)
{
    //LoginTicket loginTicket = loginTicketMapper.selectLoginTicket(ticket);
    //System.out.println("退出时候的Expired"+loginTicket.getExpired());
    //loginTicketMapper.updateLoginTicket(ticket,1);
    //使用Redis来修改状态
    String redisKey= RedisKeyUtil.getTicketKey(ticket);
    LoginTicket loginTicket = (LoginTicket)redisTemplate.opsForValue().get(redisKey);
    loginTicket.setStatus(1);
    redisTemplate.opsForValue().set(redisKey,loginTicket);

}
public LoginTicket findLoginTicket(String ticket) {

    //return loginTicketMapper.selectLoginTicket(ticket);
    String redisKey= RedisKeyUtil.getTicketKey(ticket);
    LoginTicket loginTicket = (LoginTicket)redisTemplate.opsForValue().get(redisKey);
    return loginTicket;
}
使用Redis缓存用户信息

1、当查询的时候,优先从缓存中取值;

2、缓存中取不到的时候初始化缓存数据;

3、数据变更时清除缓存数据(如果采取更新缓存中数据的方法可能会带来并发问题,并且比较繁琐);

直接存取user对象,会序列化成Json字符串

 private static final String PREFIX_USER = "user";
// 用户
public static String getUserKey(int userId) {
    return PREFIX_USER + SPLIT + userId;
}
//1、当查询的时候,优先从缓存中取值;
private User getCache(int userId)
{
    String redisKey=RedisKeyUtil.getUserLikeKey(userId);
    return  (User)redisTemplate.opsForValue().get(redisKey);

}

//2、缓存中取不到的时候初始化缓存数据;
private User initCache(int userId)
{
    User user=userMapper.queryById(userId);
    String redisKey=RedisKeyUtil.getUserLikeKey(userId);
    redisTemplate.opsForValue().set(redisKey,user,3600, TimeUnit.SECONDS);
    return user;
}

//3、数据变更时清除缓存数据(如果采取更新缓存中数据的方法可能会带来并发问题,并且比较繁琐);
private void clearCache(int userId)
{
    String redisKey=RedisKeyUtil.getUserLikeKey(userId);
    redisTemplate.delete(redisKey);
}
public User queryUserById(int userId) {
    //return userMapper.queryById(userId);
    User user=getCache(userId);
    if(user==null)
    {
        user=initCache(userId);
    }
    return  user;
}

在更新数据的地方清理缓存

//更新头像路径
public int updateHeader(int id,String header_url)
{
    //return userMapper.UpdateHeader(id,header_url);
    int rows=userMapper.UpdateHeader(id,header_url);
    clearCache(id);
    return rows;
}
  //修改密码  这里传入的password应该为加密后的
    public int updatePassword(int id,String password)
    {
        int rows= userMapper.UpdatePassword(id,password);
        clearCache(id);
        return rows;
    }
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/756290.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号