背景: 原登陆接口,校验密码通过后,使用springsession记录会话信息,将信息存入在redis中
基于原逻辑进行多设备登陆开发,默认的时候多设备登陆开关开启,即按原来逻辑处理,只要密码登陆校验成功之后,都会将当前的会话信息存入redis中.
当多设备开关关闭时候,同一个账号同一时间只能在一个设备上运行.实现思路如下:
1.用户每次登录时,前端在header请求头中加入DeviceId字段传给后端,登陆校验成功后,springsession将 `spring:session:sessions:+sessionid`作为key存入到redis中,将deviceId作为属性存入该key中.前端使用的库提示获取的diviceId唯一概率100%,所以加上后端获取的客户端ip+设备的mac地址,计算md5值作为设备唯一id
而后将userId与sessionId进行映射,即一个userId对应多次登陆会话sessionId.
2.用户访问的时候,在过滤器解析sessionid,获取userid不为空,则说明有权限访问。如果获取userid为空,则告诉无权限访问,跳转到登录页面。
3.用户在另一台设备登录时,登陆成功后,根据userId查看对应的sessionId,根据sessionId查找在线中的会话,然后与当前登陆设备的deviceId进行对比
如果一致则不处理(同设备下该账号可以在其他浏览器登陆),如果不一致,则删除redis缓存中的session会话信息,使之前该账号的登陆会话失效.