微信端浏览器有两个相同名的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使老用户的登录出现问题。

posted @ 2022-04-30 23:12  zjhgx  阅读(262)  评论(0编辑  收藏  举报