Redis企业项目实战--登录校验拦截器

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: Redis企业项目实战--登录校验拦截器

拦截器


拦截器的作用在于将重复的登录校验功能安装在拦截器上(某些请求需要要求用户等登录才能启用)但不可能在每一个业务模块都写校验的代码,于是拦截器的作用就在于拦截请求 去检查用户的状态 是否处于在线 若是在线就刷新token的有效期 token存在Redis中


细节实现就不说了 实现部分的代码


一号拦截器


只需要检查ThreadLocal中是否有用户(有说明登录了,因为登录校验操作中会把用户信息存在ThreadLocal)

Java
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//1.判断是否需要拦截(ThreadLocal中是否有用户)
if (UserHolder.getUser() == null) {
response.setStatus(401);
return false;
}

return true;
}
}

二号拦截器


这里我们注入了Redis因为要用Redis来存用户信息

public class RefreshTokeninterceptor implements HandlerInterceptor {

    //而MvcConfig中使用了 LoginInterceptor 所以我们要去到MvcConfig进行注入
    private StringRedisTemplate stringRedisTemplate;
    //因为这个类不是spring boot构建的,而是手动创建的类,所以依赖注入不能用注解来注入,要我们手动使用构造函数来注入这个依赖
    public RefreshTokeninterceptor(StringRedisTemplate stringRedisTemplate) {
        this.stringRedisTemplate = stringRedisTemplate;
    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //获取请求头中的token  在前端代码中详见authorization
        String token = response.getHeader("authorization");
        if(StrUtil.isBlankIfStr(token)){{//判断是否为空
            return  true;
        }
        // 基于token获取Redis用户
        String Token = RedisConstants.LOGIN_USER_KEY + token;
        Map<Object,Object> UserMap = stringRedisTemplate.opsForHash().entries(Token);
        //判断用户是否存在
        if(UserMap.isEmpty()){
            return  true;
        }
        // 将查询到的hash数据转化为userDTO对象
        //fillBeanWithMap是用UserMap来填充 UserDTO这个Bean,最后一个参数是你是否忽略转换过程中的错误
        UserDTO user = BeanUtil.fillBeanWithMap(UserMap, new UserDTO(), false);
        //存在 保存用户信息到TheadLocal
        UserHolder.saveUser(user);
        //刷新token有效期
        stringRedisTemplate.expire(Token,RedisConstants.LOGIN_USER_TTL, TimeUnit.MINUTES);
        //放行
        response.setStatus(200);
        return true;
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        //移除用户
        UserHolder.removeUser();
    }
}


最后是配置拦截器

@Configuration
public class MvcConfig implements WebMvcConfigurer {

    @Resource
    private StringRedisTemplate stringRedisTemplate;

    @Override
    //添加拦截器  InterceptorRegistry registry 拦截器的注册器  excludePathPatterns排除不需要的拦截的路径
    // 只要跟登录无关就不需要拦截  拦截器的作用只是校验登录状态
    public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(new LoginInterceptor())
                    .excludePathPatterns(
                    "/user/login",
                    "/user/code",
                    "/blog/hot",
                    "/shop/**",
                    "/shop-type/**",
                    "/voucher/**"
            ).order(1);
        //order是设置先后
        //刷新token的拦截器
        registry.addInterceptor(new RefreshTokeninterceptor(stringRedisTemplate)).addPathPatterns("/**").order(0);
    }

}
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1月前
|
NoSQL 关系型数据库 Redis
DMS产品常见问题之dms登录redis实例时报错如何解决
DMS(数据管理服务,Data Management Service)是阿里云提供的一种数据库管理和维护工具,它支持数据的查询、编辑、分析及安全管控;本汇总集中了DMS产品在实际使用中用户常遇到的问题及其相应的解答,目的是为使用者提供快速参考,帮助他们有效地解决在数据管理过程中所面临的挑战。
|
3月前
|
NoSQL Redis 数据库
数据传输DTS中金融云跨账号同步Redis,增量校验报错了
【1月更文挑战第16天】【1月更文挑战第80篇】数据传输DTS中金融云跨账号同步Redis,增量校验报错了
65 1
|
19天前
|
存储 监控 NoSQL
使用Redis的Bitmap统计一周连续登录的用户
使用Redis的Bitmap统计一周连续登录的用户
9 1
|
1月前
|
前端开发 NoSQL Java
【SpringBoot】秒杀业务:redis+拦截器+自定义注解+验证码简单实现限流
【SpringBoot】秒杀业务:redis+拦截器+自定义注解+验证码简单实现限流
|
1月前
|
存储 NoSQL 前端开发
【SpringBoot】Redis集中管理Session和自定义用户参数解决登录状态及校验问题
【SpringBoot】Redis集中管理Session和自定义用户参数解决登录状态及校验问题
|
1月前
|
消息中间件 存储 NoSQL
【Redis项目实战】使用Springcloud整合Redis分布式锁+RabbitMQ技术实现高并发预约管理处理系统
【Redis项目实战】使用Springcloud整合Redis分布式锁+RabbitMQ技术实现高并发预约管理处理系统
|
1月前
|
缓存 NoSQL 安全
【Redis】2、Redis应用之【根据 Session 和 Redis 进行登录校验和发送短信验证码】
【Redis】2、Redis应用之【根据 Session 和 Redis 进行登录校验和发送短信验证码】
51 0
|
3月前
|
NoSQL 前端开发 Java
Sa-Token实现分布式登录鉴权(Redis集成 前后端分离)
Sa-Token实现分布式登录鉴权(Redis集成 前后端分离)
Sa-Token实现分布式登录鉴权(Redis集成 前后端分离)
|
17天前
|
NoSQL Linux Redis
06- 你们使用Redis是单点还是集群 ? 哪种集群 ?
**Redis配置:** 使用哨兵集群,结构为1主2从,加上3个哨兵节点,总计分布在3台Linux服务器上,提供高可用性。
237 0

热门文章

最新文章