반응형

로그인 세션 관리 및 세션을 이용한 중복 로그인 처리

  • HttpSessionListener 를 이용한 세션 생성, 종료 이벤트 수신
  • {유저 아이디 : 세션} HashTable을 이용한 세션 관리 및 중복 로그인 처리
  • 로그인 여부, 세션 연장 서블릿 생성

 

MySessionManager.java : 세션 리스너 + 해시맵에 유저별 세션 관리

import java.util.Hashtable;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
 
/*
리스너 등록방법
 1. @WebListener 어노테이션 사용
 2. web-app xml설정 추가
	<?xml version="1.0" encoding="UTF-8"?>
	<web-app ...>
	     <listener>
	          <listener-class>com.srctree.session.MySessionManager</listener-class>
	     </listener>
	</web-app>
*/
@WebListener
public class MySessionManager implements HttpSessionListener {
	public static int SESSION_TIME = 20*60;//20분
 
	private static MySessionManager sessionManager;
	public static MySessionManager instance() {
		if (sessionManager == null) {
			synchronized (MySessionManager.class) {
				if (sessionManager == null) {
					sessionManager = new MySessionManager();
				}
			}
		}
		return sessionManager;
	}
  
	private Hashtable<String, HttpSession> useridHash;//유저 아이디 : 세션
 
	public MySessionManager() {
		useridHash = new Hashtable<String, HttpSession>();
	}
 
	public void sessionCreated(HttpSessionEvent se)  {
		addSession(se.getSession());
		System.out.printf("생성된 SESSIONID %s \n",  se.getSession().getId());
	}
 
	public void sessionDestroyed(HttpSessionEvent se)  {
		removeSession(se.getSession());
		System.out.printf("제거된 SESSIONID %s \n",  se.getSession().getId());
	}
 
	//세션 추가
	void addSession(HttpSession session) {
	}
 
	//세션 삭제
	void removeSession(HttpSession session) {
		//useridHash 체크 후 제거
		String idKey = (String)session.getAttribute("idKey");
		if(idKey != null && useridHash.containsKey(idKey)) {
			useridHash.remove(idKey);
			System.out.printf("removeSession() : %s[count: %d] \n", idKey, useridHash.size());
		}
	}
 
	//촏 개수 리턴
	int getCount() {
		return useridHash.size();
	}
 
	//중복로그인 처리
	public void loginProcess(String userid, HttpSession session) {
		//해당 유저아이디의 세션이 이미 존재한다면 이전 세션은 종료처리한다.
		try {
			if(useridHash.containsKey(userid)) {
				HttpSession prvSession = useridHash.get(userid);
				String idKey = (String)prvSession.getAttribute("idKey");
				//현재 정상적으로 로그인이 된 상태라면
				if(idKey != null && idKey.length() > 0) {				
					prvSession.invalidate();
					System.out.printf("loginProcess() : 기존세션 종료처리 \n");
				}
			}
		} catch(Exception e) {
			e.printStackTrace();
		}
		
		session.setMaxInactiveInterval(SESSION_TIME);
		session.setAttribute("idKey", userid);

		useridHash.put(userid, session);
		System.out.printf("loginProcess() : %s[getId(): %s][count: %d] \n", userid, session.getId(), useridHash.size());
	}
}

(참고) 세션(Session) 메소드

Object getAttribute(String name) 
세션 속성명이 name인 속성의 값을 Object 타입으로 리턴한다. 해당 되는 속성명이 없을 경우에는 null 값을 리턴한다.

Enumeration getAttributeNames() 
세션 속성의 이름들을 Enumeration 객체 타입으로 리턴한다.
 
long getCreationTime() 
1970년 1월 1일 0시 0초를 기준으로 하여 현재 세션이 생성된 시간까지 경과한 시간을 계산하여 1/1000초 값으로 리턴한다. 
 
String getId() 
세션에 할당된 고유 식별자를 String 타입으로 리턴한다. 
 
int getMaxInactiveInterval()
현재 생성된 세션을 유지하기 위해 설정된 세션 유지시간을 int형으로 리턴한다.
 
void invalidate() 
현재 생성된 세션을 무효화 시킨다.
 
void removeAttribute(String.name)
세션 속성명이 name인 속성을 제거한다. 
 
void setAttribute(String name, Object value)
세션 속성명이 name인 속성에 속성값으로 value를 할당한다. 
 
void setMaxInactiveInterval(int interval) 
세션을 유지하기 위한 세션 유지시간을 초 단위로 설정한다. 

 

MySessionServlet.java : 로그인 여부, 로그인 연장

import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
 
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
 
import com.google.gson.Gson;
 
/**
 * Servlet implementation class MySessionServlet
 */
@WebServlet("/MySessionServlet")
public class MySessionServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
 
    /**
     * @see HttpServlet#HttpServlet()
     */
	public MySessionServlet() {
		super();
	}
 
	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String action = request.getParameter("action");
		if("isLogin".equals(action)) {
			HttpSession session = request.getSession();
			String idKey = (String)session.getAttribute("idKey");
 
			HashMap<String, Object> map = new HashMap<String, Object>();
			if(idKey != null && idKey.length() > 0) {
				map.put("result", "success");
				map.put("message", "로그인 중입니다.");
			} else {
				map.put("result", "fail");
				map.put("message", "일정시간 동작이 없거나, 다른 곳에서 로그인을 하여 로그아웃 되었습니다.\n다시 로그인 해주세요.");
			}
 
			String rtnJsonString = new Gson().toJson(map);
 
			response.setContentType("application/json");
			response.setCharacterEncoding("UTF-8");
			PrintWriter out = response.getWriter();
			out.print(rtnJsonString);
			out.flush();
 
			System.out.printf("isLogin : %s \n", map.toString());
		}
		else if("sessionRefresh".equals(action)) {
			HttpSession session = request.getSession();
			session.setMaxInactiveInterval(MySessionManager.SESSION_TIME);
 
			System.out.printf("sessionRefresh\n");
		}
	}
 
	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}
}

 

MemberServlet.java : 사용자 로그인 후 처리

//로그인 성공 후 호출
HttpSession session = request.getSession();
MySessionManager.instance().loginProcess(id, session);

 

 

JSP 페이지 : 페이지 로딩 완료 후 세션 체크

$(document).ready(function() {
	//---세션 종료 체크---------------
	var sessionId = "<%=session.getAttribute("idKey")%>";
	//세션 종료됨
	if(sessionId == null || sessionId == "null" || sessionId.length == 0) {
		alert(""일정시간 동작이 없거나, 다른 곳에서 로그인을 하여 로그아웃 되었습니다.\n다시 로그인 해주세요."");
		//초기 페이지 이동 동의 처리 추가
		//...
 
		return;
	}
	//...
}

 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기