you are following the correct path
ユーザーセッションを無効にするため
usersSessions.forEach((session) -> {
sessionRegistry.getSessionInformation(session.getId()).expireNow();
});
注意事項
SessionInformation.expireNow()
redis
からエントリを削除することを意味するものではありません データベースでは、正しく述べたように、期限切れの属性をセッションに追加するだけです。
しかし、これによりユーザーのセッションが無効になるのはなぜですか?
ここで、ConcurrentSessionFilterが機能します。.doFilter()
メソッドは、automatically logging out
というトリックを実行します
これがConcurrentSessionFilterのスニペットです
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
HttpSession session = request.getSession(false);
if (session != null) {
SessionInformation info = sessionRegistry.getSessionInformation(session
.getId());
if (info != null) {
if (info.isExpired()) {
// Expired - abort processing
doLogout(request, response);
String targetUrl = determineExpiredUrl(request, info);
if (targetUrl != null) {
redirectStrategy.sendRedirect(request, response, targetUrl);
return;
}
else {
response.getWriter().print(
"This session has been expired (possibly due to multiple concurrent "
+ "logins being attempted as the same user).");
response.flushBuffer();
}
return;
}
else {
// Non-expired - update last request date/time
sessionRegistry.refreshLastRequest(info.getSessionId());
}
}
}
chain.doFilter(request, response);
}
よろしくお願いします!