- 서블릿 필터를 사용한 기존 세션 무효화
서블릿 필터를 사용하여 동일한 계정으로 로그인할 때 이전 세션을 무효화할 수 있다. 이 방법은 서버에서 관리하는 세션 맵을 이용하여 로그인 시 중복 로그인을 감지하고 처리하는 방식이다.
- SessionManagementFilter.java 추가
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;
public class SessionManagementFilter implements Filter {
// 사용자 ID를 키로 하고, 세션을 값으로 가지는 맵
private static final ConcurrentHashMap<String, HttpSession> sessionMap = new ConcurrentHashMap<>();
@Override
public void init(FilterConfig filterConfig) throws ServletException {}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
HttpSession currentSession = httpRequest.getSession(false);
if (currentSession != null && currentSession.getAttribute("userId") != null) {
String userId = (String) currentSession.getAttribute("userId");
// 기존의 세션이 있다면 무효화
HttpSession oldSession = sessionMap.put(userId, currentSession);
if (oldSession != null && !oldSession.equals(currentSession)) {
oldSession.invalidate();
}
}
chain.doFilter(request, response);
}
@Override
public void destroy() {}
}
- 사용 방법
로그인 성공 시 아래와 같이 세션에 사용자 ID를 저장하는 로직을 추가한다.
HttpSession session = request.getSession();
session.setAttribute("userId", userId);
SessionManagementFilter를 web.xml에 등록한다.
<filter>
<filter-name>sessionManagementFilter</filter-name>
<filter-class>com.example.SessionManagementFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>sessionManagementFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
이 방식으로 동일한 계정으로 여러 기기에서 로그인하면, 가장 최근에 로그인한 세션만 유지되고 이전 세션은 무효화된다.