设置session与Cookie

在分布式中 多个服务一般分别部署在不同的服务器中 不同的服务器因为作用域不同无法共享session
为了解决这一问题 可以自己生成一个token 访问服务时 判断token是否合法 如果合法则放行
只有token是无法识别用户的 所以还得保存一个UserId
在本项目中似乎未验证token 只要不为空就可以通过 似乎不安全 可以添加验证操作
image

这段代码首先判断用户状态码是否为空 之前因为没有设置用户而无法通过 调试半天
然后判断用户状态是否已冻结
之后生成uuid作为用户token 设置到cookie中

        if (appUser.getActiveStatus() != null && !appUser.getActiveStatus().equals(UserStatus.FROZEN.type)) {
            // 将token存储至redis中
            String uToken = UUID.randomUUID().toString();
            redisOperator.set(REDIS_USER_TOKEN + ":" + appUser.getId(), uToken);

            setCookie(request, response, "utoken", uToken, COOKIE_AGE);
            setCookie(request, response, "uid", appUser.getId(), COOKIE_AGE);
        }

设置cookie可能在别的controller中也要使用 所以可以抽到baseController中
在添加个 REDIS_USER_TOKEN 字段作为token的key
setDomain 设置域
setPath("/") 设置路径 imoocnews.com 下的所以域名都可以访问

    protected static final Integer COOKIE_AGE = 30 * 60 * 60;

    protected void setCookie(HttpServletRequest request,
                             HttpServletResponse response,
                             String key, String value, Integer maxAge)  {
        String encoderKey = URLEncoder.encode(key, StandardCharsets.UTF_8);
        setCookieValue(request, response, encoderKey, value, maxAge);

    }

    protected void setCookieValue(HttpServletRequest request,
                                  HttpServletResponse response,
                                  String key, String value, Integer maxAge) {
        Cookie cookie = new Cookie(key, value);
        cookie.setMaxAge(maxAge);
        cookie.setDomain("imoocnews.com");
        cookie.setPath("/");

        response.addCookie(cookie);
    }

最后将登录或注册完成将验证码从redis中删除 并将帐号状态返回

        redisOperator.del(MOBILE_SMS_CODE + ":" + mobile);

        return GraceJSONResult.ok(appUser.getActiveStatus());
posted @   RainbowMagic  阅读(147)  评论(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 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示