现在有点疑问:
我将session存到redis中, 经过测试同一台电脑用不同浏览器访问我的应用,会生成两套sessionID。。
这样子怎么确定我账号当前是哪个session,主要是想实现避免用户重复登录的情况。
现在有点疑问:
我将session存到redis中, 经过测试同一台电脑用不同浏览器访问我的应用,会生成两套sessionID。。
这样子怎么确定我账号当前是哪个session,主要是想实现避免用户重复登录的情况。
一个用户只有一个sessionId
,用户第一次访问,服务端生成sessionId,放在http header中传给前端,前端会把这个sessionId存在用户本地,也就是cookie,以后前后端交互的时候都需要传递cookie来确定用户的身份。
"实现避免用户重复登录"是什么意思?
我们假设你有如下场景:
电脑A登录网站,因为cookie
中没有任何信息,所以需要登录,登录后服务器端生成一个sessionID
,并返回给前端,浏览器记入cookie
,下次再开这个网页时,只要cookie
没过期,就会把sessionID
传给服务器,服务器凭此sessionID
找到用户信息,然后告诉前端已经登录过了可以反问登录后的页面/信息。
电脑B在电脑A登录过之后,也去访问网站,然后因为cookie
中没有任何信息,所以需要登录,登录后服务器端生成一个sessionID
,并返回给前端,浏览器记入cookie
。。。。一切如电脑A一样。没毛病
所以你的问题是?
spring security里面是通过用户名的hash值来判断是否是重复登录的,可以配置禁止登录还是踢出之前的登录。
就是实现一个过滤器在做登录验证的时候进行判断,可以参考security的实现方式。
比如登陆的话, 你会自己保存一些用户信息到当前的session中,每次登陆的时候另开一条线程遍历所有的session,通过userInfo里面的某一字段进行查找(比如username),存在两条记录以上就删除的session即可.
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
两个浏览器代表两个不同的客户端,当然会有两个sessionId咯。
用户重复登录的问题可以通过注销上一个登录信息或者覆盖上一个登录的信息来解决。
由于http协议的无状态性,服务器是没法确定哪一个是你当前账号的session的...
-重新读了一遍问题,发现题主的意思应该是在服务器集群下如何使两个服务器辨别同一个用户才对,我觉得可以采用共同使用同一存储中心的方式来完成。恩,对于redis了解不多,希望有大神来指正,小的不才,说错勿怪。