目前后端用户认证用了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使老用户的登录出现问题。