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 sessionAttributes, StompHeaderAccessor stompHeaderAccessor) { User user = SecurityUtils.getCurrentUserFromWebSocket(sessionAttributes); if (user != null) { // 클러스터링 환경에서 접속중인 사용자 정보를 저장한다. this.updateActiveUser(user); } } // 클러스터링 환경에서 접속중인 사용자 정보를 저장한다. private void updateActiveUser(User user) { // 전체 사용자 정보 Map totalActiveUserMap = new HashMap<>(); Gson gson = new Gson(); // 살아있다고 요청한 사용자 정보 Map 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)gson.fromJson(activeUsers, Object.class); } totalActiveUserMap.put(MapUtil.getString(currentActiveUserMap, "id"), currentActiveUserMap); String content = gson.toJson(totalActiveUserMap); this.stringRedisTemplate.opsForValue().set("activeUsers", content); } }