1.用拦截器控制及redis实现同一用户只能单台设备在线
前后端不分离,使用session:
登录
登录时将用户信息存储至session中。
session.setAttribute("usserId",user.getId());
然后在将userId和sessionId 进行绑定存储至redis(也可以使用别的全局唯一数据源来存储,如静态Map,或别的缓存中间件)
redisTemplate.opsForValue().set(user.getId(),session.getId());
拦截器判断是否在别处登录
拦截器从session中取出userId
Long userId = (Long)session.getAttribute("usserId");
=》 能取到表示已登录。取不到表示未登录或session过期已下线
然后在根据userId从redis中取出sessionId 根据redis中的sessionId
和当前登录sessionId进行比较
String sessionId = (String) redisTemplate.opsForValue().get(userId);
if (sessionId === session.getId())
=》 如果一致表示没有在别处登录,如果不一致表示用户已在别处登录(因为如果有另一人在别处登录相同userId的redis会覆盖掉)
前后端分离:
登录
登录时将用户信息存储至redis中。
redisTemplate.opsForValue().set(token,user.getId());
然后在将userId和token 进行绑定存储至redis(也可以使用别的全局唯一数据源来存储,如静态Map,或别的缓存中间件)
redisTemplate.opsForValue().set(user.getId(),token);
拦截器判断是否在别处登录
拦截器从redis中根据token取出userId
Long userId = (Long)redisTemplate.opsForValue().get(token);
=》 能取到表示已登录。取不到表示未登录或token过期已下线
然后在根据userId从redis中取出token 根据redis中的token
和当前登录token进行比较
String redisToken = (String) redisTemplate.opsForValue().get(userId);
if (redisToken === token)
=》 如果一致表示没有在别处登录,如果不一致表示用户已在别处登录(因为如果有另一人在别处登录相同userId的redis会覆盖掉)