下面的辦法將更加優化:
- 堅持用戶登錄時
- 運行一個cron每5秒(根據您的要求)檢查過期的會話(即t他會話在閾值時間之後仍然存在)並將其標記爲過期。
- (可選)發佈一條消息給Faye,該消息應該通知UI(UI應實現對Faye的訂閱)會話已過期。
你可以使用這樣的到期令牌:
public void expireToken (HttpServletRequest request, HttpServletResponse response){
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (auth != null){
SecurityContextHolder.getContext().setAuthentication(null);
}
}
要獲取所有當前會話,你可以使用以下命令:
public class UserController {
@Autowired
private SessionRegistry sessionRegistry;
public void listLoggedInUsers() {
final List<Object> allPrincipals = sessionRegistry.getAllPrincipals();
for(final Object principal : allPrincipals) {
if(principal instanceof SecurityUser) {
final SecurityUser user = (SecurityUser) principal;
// if currentTime > logInTime + threshold time
expireToken();
}
}
}
}
注:我個人避免從前端輪詢後端,因爲它聽起來不是一個最佳方法
你看過例子spring jdb c會話。 https://github.com/spring-projects/spring-session/blob/master/spring-session-jdbc/src/main/java/org/springframework/session/jdbc/JdbcOperationsSessionRepository.java 在那裏你可以配置最大空閒超時。 –
春季安全中是否有任何選項可以創建自定義會話? –
也許這兩個組合:https://stackoverflow.com/questions/5385175/setting-session-timeout-period-with-spring-security-3-0(如何設置超時)和https:// stackoverflow。 com/questions/7342936/how-to-get-session-information-in-spring-mvc-3(如何從控制器獲取會話) – Brian