设置session与Cookie
在分布式中 多个服务一般分别部署在不同的服务器中 不同的服务器因为作用域不同无法共享session
为了解决这一问题 可以自己生成一个token 访问服务时 判断token是否合法 如果合法则放行
只有token是无法识别用户的 所以还得保存一个UserId
在本项目中似乎未验证token 只要不为空就可以通过 似乎不安全 可以添加验证操作
这段代码首先判断用户状态码是否为空 之前因为没有设置用户而无法通过 调试半天
然后判断用户状态是否已冻结
之后生成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());
虽然道路是曲折的,但前途是光明的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律