用户会话拦截器

若用户未登录 不能进行某些操作 如修改用户信息等

业务思路:

  1. 从header中取出userId 和 token
  2. 判断token是可以取出userid和token 若未取出则表示未登录 抛出异常并返回
  3. 从redis中取出token信息 若未取出表示未登录
  4. 判断token是前端传入的token是否和redis中存储的token一直 若不一致提示会话失效 重新登录

将他们封装到BaseIntercepto中因为其他的拦截器可能会用到

@Component
public class BaseInterceptor {
    protected static final String REDIS_USER_TOKEN = "redis_user_token";
    protected static final String REDIS_USER_CACHE = "redis_user_cache";

    @Autowired
    private RedisOperator redisOperator;

    public boolean verityUserToken(String userId, String userToken, String redisPrefix) {

        if (StringUtils.isBlank(userId) && StringUtils.isBlank(userToken)) {
            GraceException.display(ResponseStatusEnum.UN_LOGIN);

            return false;
        } else {
            String redisUserToken = redisOperator.get(redisPrefix + ":" + userId);

            if (StringUtils.isBlank(redisUserToken)) {
                GraceException.display(ResponseStatusEnum.UN_LOGIN);

                return false;
            } else if (!userToken.equals(redisUserToken)) {
                GraceException.display(ResponseStatusEnum.TICKET_INVALID);
                return false;
            }
        }

        return true;
    }
}

拦截器调用BaseController验证合法即可

public class UserTokenInterceptor extends BaseInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String userToken = request.getHeader("headerUserToken");
        String userId = request.getHeader("headerUserId");

        return  super.verityUserToken(userId, userToken, REDIS_USER_TOKEN);
    }
}

之后在configuration中注入bean并注册拦截器即可

    @Bean
    public UserTokenInterceptor userTokenInterceptor() {
        return new UserTokenInterceptor();
    }
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(userTokenInterceptor())
                .addPathPatterns("/user/updateUserInfo")
                .addPathPatterns("/user/getAccountInfo");

    }
posted @   RainbowMagic  阅读(68)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示