【发布时间】:2021-10-14 23:02:25
【问题描述】:
我想创建一个返回在线用户列表的服务。用户使用 JWT 令牌登录 - 但我不确定如何获取在线用户 - 或/并返回用户列表但指出他们是否在线。
我是否必须在 mongodb 中存储已登录/注销的会话令牌/电子邮件 - 如果他们不注销怎么办?
我当前的代码如下所示
@CrossOrigin
@GetMapping("/api/getActiveUsers")
public ResponseEntity<Object> activeUser(HttpServletRequest request) {
TokenManagement user = new TokenManagement();
try {
// return the user authenticate
HttpSession session = request.getSession(true);
List<Object> userListHttp = (List<Object>) Arrays.asList(session.getAttribute("user"));
// alternative way for get user logged
List<String> userList = getUsersFromSessionRegistry();
return ResponseEntity.ok().body(userListHttp);
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
public List<String> getUsersFromSessionRegistry() {
return sessionRegistry.getAllPrincipals()
.stream()
.filter((u) -> !sessionRegistry.getAllSessions(u, false)
.isEmpty())
.map(o -> {
if (o instanceof Person) {
return ((Person) o).getEmail();
} else {
return o.toString();
}
}).collect(Collectors.toList());
}
【问题讨论】:
-
不,您不能存储会话令牌。相反,您可以存储一个“logged_in_until”,它只包含一个时间戳,其值与 jwt 的到期时间相同,每当更新 jwt 时都会更新,如果用户注销则清除。未注销的用户即使关闭浏览器、关闭计算机等仍处于登录状态。
-
所以如果登录用户显示 - api 活动,可能会指示用户在线布尔值?
标签: java spring-boot jwt