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

简介: 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);
    }

}
相关文章
|
9月前
|
存储 NoSQL 前端开发
Redis专题-实战篇一-基于Session和Redis实现登录业务
本项目基于SpringBoot实现黑马点评系统,涵盖Session与Redis两种登录方案。通过验证码登录、用户信息存储、拦截器校验等流程,解决集群环境下Session不共享问题,采用Redis替代Session实现数据共享与自动续期,提升系统可扩展性与安全性。
539 3
Redis专题-实战篇一-基于Session和Redis实现登录业务
|
缓存 NoSQL Redis
为什么越来越多的企业选择Redis?简述Redis生平
Redis(Remote Dictionary Server)是一个开源的内存数据库管理系统,支持数据库、缓存和消息中间件功能。Redis 由 Salvatore Sanfilippo 于2009年创建,历经多个版本迭代,引入了如持久化、集群、事务等功能。Redis 支持多种数据结构(字符串、列表、集合等),并提供高可用性和水平扩展能力。广泛应用于 Twitter、GitHub 等知名网站。
425 1
|
NoSQL 关系型数据库 MySQL
当Redis与MySQL数据一致性校验中Redis数据量小于MySQL时的全量查询处理方法
保持Redis和MySQL之间的数据一致性是一个需要细致规划和持续维护的过程。通过全量数据同步、建立增量更新机制,以及定期执行数据一致性校验,可以有效地管理和维护两者之间的数据一致性。此外,利用现代化的数据同步工具可以进一步提高效率和可靠性。
260 6
|
存储 NoSQL Java
大事件后端项目34_登录优化----redis_SpringBoot集成redis
大事件后端项目34_登录优化----redis_SpringBoot集成redis
大事件后端项目34_登录优化----redis_SpringBoot集成redis
|
存储 NoSQL Redis
大事件后端项目33_登录优化-redis_思路分析
大事件后端项目33_登录优化-redis_思路分析
|
运维 NoSQL 数据管理
数据管理DMS产品使用合集之无法通过DMS登录Redis并收到"NOAUTH Authentication required"的错误提示,该怎么解决
阿里云数据管理DMS提供了全面的数据管理、数据库运维、数据安全、数据迁移与同步等功能,助力企业高效、安全地进行数据库管理和运维工作。以下是DMS产品使用合集的详细介绍。
430 1
|
NoSQL Redis 数据安全/隐私保护
大事件后端项目35——登录优化_redis_主动失效机制实现
大事件后端项目35——登录优化_redis_主动失效机制实现
|
缓存 NoSQL 关系型数据库
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
|
8月前
|
缓存 负载均衡 监控
135_负载均衡:Redis缓存 - 提高缓存命中率的配置与最佳实践
在现代大型语言模型(LLM)部署架构中,缓存系统扮演着至关重要的角色。随着LLM应用规模的不断扩大和用户需求的持续增长,如何构建高效、可靠的缓存架构成为系统性能优化的核心挑战。Redis作为业界领先的内存数据库,因其高性能、丰富的数据结构和灵活的配置选项,已成为LLM部署中首选的缓存解决方案。
856 25