package kr.wisestone.owl.web.controller;
|
|
import com.google.gson.Gson;
|
import kr.wisestone.owl.domain.User;
|
import kr.wisestone.owl.util.CommonUtil;
|
import kr.wisestone.owl.util.MapUtil;
|
import kr.wisestone.owl.util.SecurityUtils;
|
import org.apache.commons.lang3.StringUtils;
|
import org.slf4j.Logger;
|
import org.slf4j.LoggerFactory;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.data.redis.core.StringRedisTemplate;
|
import org.springframework.messaging.handler.annotation.Header;
|
import org.springframework.messaging.handler.annotation.MessageMapping;
|
import org.springframework.messaging.simp.stomp.StompHeaderAccessor;
|
import org.springframework.stereotype.Controller;
|
|
import java.util.HashMap;
|
import java.util.Map;
|
|
@Controller
|
public class WebSocketSessionController {
|
|
private static final Logger log = LoggerFactory.getLogger(WebSocketSessionController.class);
|
|
@Autowired
|
private StringRedisTemplate stringRedisTemplate;
|
|
|
@MessageMapping("/session/alive")
|
public void active(@Header("simpSessionAttributes") Map<String, Object> sessionAttributes, StompHeaderAccessor stompHeaderAccessor) {
|
User user = SecurityUtils.getCurrentUserFromWebSocket(sessionAttributes);
|
|
if (user != null) {
|
// 클러스터링 환경에서 접속중인 사용자 정보를 저장한다.
|
this.updateActiveUser(user);
|
}
|
}
|
|
// 클러스터링 환경에서 접속중인 사용자 정보를 저장한다.
|
private void updateActiveUser(User user) {
|
// 전체 사용자 정보
|
Map<String, Object> totalActiveUserMap = new HashMap<>();
|
Gson gson = new Gson();
|
// 살아있다고 요청한 사용자 정보
|
Map<String, Object> currentActiveUserMap = new HashMap<>();
|
currentActiveUserMap.put("id", user.getId());
|
currentActiveUserMap.put("account", CommonUtil.decryptAES128(user.getAccount()));
|
currentActiveUserMap.put("name", user.getName());
|
currentActiveUserMap.put("sessionActiveTime", String.valueOf(System.currentTimeMillis()));
|
currentActiveUserMap.put("lastWorkspaceId", user.getLastWorkspaceId());
|
|
// 테스트용 키 삭제
|
//this.stringRedisTemplate.delete(Lists.newArrayList("activeUsers"));
|
|
String activeUsers = this.stringRedisTemplate.opsForValue().get("activeUsers");
|
|
// redis 에서 로그인 세션 정보를 가져와서 업데이트 한다.
|
if (!StringUtils.isEmpty(activeUsers)) {
|
totalActiveUserMap = (Map<String, Object>)gson.fromJson(activeUsers, Object.class);
|
}
|
|
totalActiveUserMap.put(MapUtil.getString(currentActiveUserMap, "id"), currentActiveUserMap);
|
String content = gson.toJson(totalActiveUserMap);
|
|
this.stringRedisTemplate.opsForValue().set("activeUsers", content);
|
}
|
}
|