微信端浏览器有两个相同名的cookie在shiro引发无法认证问题
目前后端用户认证用了shiro,把session保存在了redis。在部署上去后发现微信上再调用subject.login()之后,重新开一个页面,subject.isAuthenticated()却还是false。但我在微信开发工具里打开网页却是正常,能记住用户。这现象让我不禁怀疑是不是微信端的cookie没有在浏览器上带过来。在代码上打印出cookie:
javax.servlet.http.Cookie[] cookies = request.getCookies(); if(cookies !=null) { for ( javax.servlet.http.Cookie cookie:cookies ) { log.info("从浏览器获取"+cookie.getName()+"的值:"+cookie.getValue()+"domain:" + cookie.getDomain() + "path:" + cookie.getPath() + "MaxAge:" + cookie.getMaxAge() + "Secure:" + cookie.getSecure()); } }
发现有两个JSESSIONID,一个值有存在redis,一个值没有。我们知道JSESSIONID是用来记住登陆状态的,还有一个cookie是rememberMe,用户记住用户,有效期一年,是用户在安全不用太严格的情况下记住用户的。
另一方面,在微信开发者工具上,JSESSIONID只有一个。我也不清楚是不是只有微信浏览器才有这种问题(据说只要cookie的domain,path,expire有一个不同cookie就可以重名),但无法认证的问题应该就是由于多出了个session里不存在JSESSIONID导致认为用户没有登陆。
在shiro中把cookie的名字改掉,这个问题就没有了。
这个问题引申出如果要改cookie的domain啥的一定要慎重,可能会导致多出一个cookie使老用户的登录出现问题。
喜欢艺术的码农
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人