본문 바로가기
학습/JSP

19. 여러 가지 서블릿 관련 Listener API

by Elfen Lied 2022. 11. 15.
반응형
서블릿 관련 Listener 추상 메서드 기능
ServletContextAttributeListener arrtributeAdded()
attributeRemoved()
attributeReplaced()
Context 객체에 속성 추가/제거/수정
이벤트 발생 시 처리함
HttpSessionListener sessionCreated()
sessionDestroyed()
세션 객체의 생성/소멸 이벤트 발생 시 
처리함
ServletRequestListener requestInitialized()
requestDestroyed()
클라이언트의 요청 이벤트 발생 시 
처리함
ServletREquestAttributeListener attributedAdded()
attributedRemoved()
attributeReplaced()
요청 객체에 속성 추가/제거/수정 이벤트
발생 시 처리함
HttpSessionBindingListener valueBound()
valueUnbound()
세션에 바인딩/언바인딩된 객체를 알려주는
이벤트 발생 시 처리함
HttpSessionAttributeListener attributedAdded()
attributeRemoved()
attributeReplaced()
세션에 속성 추가/제거/수정 이벤트 발생 시
처리함
ServletContextListener contextInitialized()
contextDestroyed()
컨텍스트 객체의 생성/소멸 이벤트 발생 시
처리함
HttpSessionActivationListener sessionDidActivate()
sessionWillPassivate()
세션의 활성화/비활성화 이벤트 발생 시
처리함

 

 

 

- LoginVO 생성

package sec04.ex01;

import java.util.HashSet;
import java.util.Objects;
import java.util.Set;

import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;

public class LoginVO implements HttpSessionBindingListener {
	
	// 중복허용, 순서없음(index없음)
	public static Set<String> logined = new HashSet<String>();
	
	private String user_id;
	
	public LoginVO(String user_id) {
		this.user_id = user_id;
	}

	@Override
	public void valueBound(HttpSessionBindingEvent event) {
		System.out.println("세션객체에 데이터가 바인딩 됨");
		logined.add(user_id);
		System.out.println(logined);
	}

	@Override
	public void valueUnbound(HttpSessionBindingEvent event) {
		logined.remove(user_id);
		System.out.println(logined);
	}

}

 

 

- LoginTest 생성

package sec04.ex01;

import java.io.IOException;
import java.io.PrintWriter;

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;

@WebServlet("/login")
public class LoginTest extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		PrintWriter out = response.getWriter();
		HttpSession session = request.getSession();
		
		String userId = request.getParameter("user_id");
		LoginVO loginUser = new LoginVO(userId);
		if(session.isNew()) {
			session.setAttribute("loginUser", loginUser);
			request.getRequestDispatcher("member.jsp").forward(request, response);
		} else {
			out.print("<h1>로그인 해주세요</h1>");
		}
		
	}
	
}

 

 

- member 서블릿 생성

package sec04.ex01;

import java.io.IOException;
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;

@WebServlet("/logout")
public class member extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 매개값이 false 일때 세션이 존재하면 그 세션을 사용하고 새로 생성하지 않음
		HttpSession session = request.getSession(false);
		session.invalidate();
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	}

}

 

 

- login2.html 생성

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="login" method="post">
		아이디 : <input type="text" name="user_id"><br>
		비밀번호 : <input type="password" name="user_pw"><br>
		<button>로그인</button>
	</form>
</body>
</html>

 

 

- member.jsp 생성

<%@page import="sec04.ex01.LoginVO"%>
<%@ 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>
접속한 사용자 수 : <%= LoginVO.logined.size()%>
접속한 사용자 : <%= LoginVO.logined%>
	<form action="logout" method="get">
		<button>로그아웃</button>
	</form>
</body>
</html>

 

크롬으로 로그인 해보고

 

엣지로 로그인 해보고

 

크롬에 있는 첫번째를 로그아웃

다시 로그인 (세번째)로

 

로그아웃하면 세션 제거되고 카운트에서 사라짐

반응형

'학습 > JSP' 카테고리의 다른 글

18. Filter API  (0) 2022.11.16
17. 여러가지 URL 패턴 적용  (0) 2022.11.16
16. 종합(회원목록, 추가, 삭제, 로그인)  (0) 2022.11.14
15. 세션  (0) 2022.11.10
14. 쿠키  (0) 2022.11.09

댓글