🚀 싱글톤 패턴을 사용해 단 하나의 LoginManager객체로 웹에서 로그인한 사용자의 세션을 관리한다.
private static LoginManager loginManager = null;
public static synchronized LoginManager getInstance() {
if (loginManager == null) {
loginManager = new LoginManager();
}
return loginManager;
}
public void valueBound(HttpSessionBindingEvent event) {
System.out.println("valueBound 호출됨: " + event.getSession().getId());
loginUsers.put(event.getSession(), event.getName());
userCount++;
System.out.println("현재 접속자 수: " + getUserCount());
}
public void removeSession(String userId) {
Enumeration e = loginUsers.keys();
HttpSession session = null;
while (e.hasMoreElements()) {
session = (HttpSession) e.nextElement();
if (loginUsers.get(session).equals(userId)) {
session.invalidate(); // 세션 제거 (valueUnbound() 호출됨)
}
}
}
public void valueUnbound(HttpSessionBindingEvent event) {
loginUsers.remove(event.getSession());
userCount--;
}
public void setSession(HttpSession session, String userId) {
session.setAttribute(userId, this);
}
public int getUserCount() {
return loginUsers.size();
}
<%@page import="dao.UserDAO"%>
<%@page import="java.io.PrintWriter"%>
<%@page import="vo.User"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
String id = request.getParameter("userId");
String pw = request.getParameter("userPw");
// 세션이 있으면 유저 변수에 세션 값 저장
User user = (User) session.getAttribute("userId");
PrintWriter out1 = response.getWriter();
String result = null;
// 세션이 없으면(로그인이 안되어있는 상황) user에 id, pw기준으로 검색후 해당 유저 변수저장 없으면 null
try{
if (user == null) {
user = UserDAO.getUser(id, pw);
if(user == null){
result = "0";
}else{
// 세션에 회원 id를 id로 하여 player를 객체로 추가
session.setAttribute("userId", user);
result = "1";
}
}
}catch(Exception e){
result = "9";
}
System.out.println(session.getAttribute("userId"));
out1.println(result);
out1.close();
%>
</body>
</html>
session.setAttribute("userId", user);부분에서 valueBound함수가 실행되어 유저를 세션에 저장시키고, userCount증가. <%
User user = (User) session.getAttribute("userId");
LoginManager loginManager = LoginManager.getInstance();
// 사용자 정보를 바탕으로 세션에 로그인 상태 저장
if (user != null) {
loginManager.setSession(session, user.userId);
}
int userCount = loginManager.getUserCount(); // 사용자 수 가져오기
%>
<p id="user_font">
<span class="user-wrapper">
<img src="../image/numicon2.png" class="user" alt="Online Icon">
<span class="user-count"><%= userCount %></span>
<img src="../image/numicon.png" class="user" alt="Person Icon">
</span>
</p>
userCount를 통해 현재 로그인 한 사용자 수 시각화.<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
// 세션이 가진 모든 attribute를 리셋
session.invalidate();
%>
<jsp:forward page="../login/nexonLogin.jsp"></jsp:forward>
</body>
</html>
session.invalidate();가 실행되어 LoginManager의 removeSession이 실행.



session.setMaxInactiveInterval(30 * 60); // 30분