개발하는 삶

[Spring] 스코프, 필터 본문

Spring

[Spring] 스코프, 필터

삶_ 2022. 8. 29. 17:07

 

서블릿의 스코프

  • 서블릿 API에 바인딩된 속성에 대한 접근 범위
  • 기능
    • 로그인 상태 유지
    • 장바구니
    • MVC의 Model과 View의 데이터 전달 기능
  • 종류
    • 애플리케이션 스코프(ServletContext) : 애플리케이션 전체에 대해 접근 가능
    • 세션 스코프(HttpSession) : 브라우저에서만 접근 가능
    • 리퀘스트 스코프(HttpServletRequest) : 해당 요청/응답 사이클에서만 접근 가능



종류에 따라 다른 스코프 영역



SetAttribute.java

package sec01.ex01;

@WebServlet("/set")
public class SetAttribute extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		String ctxMesg = "context에 바인딩됩니다.";
		String sesMesg = "session에 바인딩됩니다.";
		String reqMesg = "request에 바인딩됩니다.";
		
		ServletContext ctx = getServletContext();
		HttpSession session = request.getSession();
		ctx.setAttribute("context", ctxMesg);
		session.setAttribute("session", sesMesg);
		request.setAttribute("request", reqMesg);
		
		out.print("바인딩을 수행합니다.");
		
	}
}


GetAttribute.java

package sec01.ex01;

@WebServlet("/get")
public class GetAttribute extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		ServletContext ctx = getServletContext();
		HttpSession sess = request.getSession();

		String ctxMesg = (String)ctx.getAttribute("context");
		String sesMesg = (String)sess.getAttribute("session");
		String reqMesg = (String)request.getAttribute("request");
		
		out.print("context값 : "+ctxMesg+"<br>");
		out.print("session값 : "+sesMesg+"<br>");
		out.print("request값 : "+reqMesg+"<br>");
	}


결과값
set → get 접속했을 때


서버 재 시작후 get 접속시




서블릿의 여러가지 url 패턴

  • 맵핑한 url 만 확인하면 됨
package sec02.ex01;

@WebServlet("/first/test")
public class TestServlet1 extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		
		String context = request.getContextPath();
		String url = request.getRequestURL().toString();
		String uri = request.getRequestURI();
		String mapping = request.getServletPath();
		
		out.println("<html>");
		out.println("<head>");
		out.println("<title>Test Servlet1</title>");
		out.println("</head>");
		out.println("<body bgcolor='green'>");
		out.println("<b>TestServlet1입니다.</b><br>");
		out.println("<b>컨텍스트 이름 : "+context+"</b><br>");
		out.println("<b>전체 경로 : "+url+"</b><br>");
		out.println("<b>매핑 이름 : "+mapping+"</b><br>");
		out.println("<b>URI : "+uri+"</b><br>");
		out.println("<body>");
		out.println("</html>");
		out.close();
	}
}
package sec02.ex01;

@WebServlet("/first/*")
public class TestServlet2 extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
		// 위와 내용은 같음 println 내용만 살짝 다름
	}
}
package sec02.ex01;

@WebServlet("*.do")
public class TestServlet3 extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
		// 위와 내용은 같음 println 내용만 살짝 다름
	}
}


결과값




필터

  • 브라우저에서 서블릿에 요청/응답할때, 미리 요청/응답 관련해 작업을 처리하는 기능

 

필터 만들기

  • web.xml에 설정
  • 애너테이션 이용

 

Filter 인터페이스의 메서드

  • destroy() : 필터 소멸시 종료 작업 수행
  • doFilter() : 요청/응답시 컨테이너에 의해 호출되어 기능 수행
  • init() : 필터 생성시 초기화 작업





여러가지 서블릿 관련 Listener API

 

ServletContextAttributeListener

attributeAdded()
attributeRemoved()
attributeReplaced()

  • Context 객체의 속성 추가/제거/수정 이벤트 발생시 처리

 

HttpSessionListener

sessionCreated()
sessionDestroyed()

  • 세션 객체의 생성/소멸 이벤트 발생시 처리

 

ServletRequestListener

requestInitialized()
requestDestroyed()

  • 클라이언트의 요청 이벤트 발생시 처리

 

ServletRequestAttributeListener

attributedAdded()
attributedRemoved()
attributeReplaced()

  • 요청 객체에 속성 추가/제거/수정 이벤트 발생시 처리

 

HttpSessionBindingListener

valueBound()
valueUnBound()

  • 세션에 바인딩/언바인딩된 객체를 알려주는 이벤트 발생시 처리

 

HttpSessionAttributeListener

attributeAdded()
attributeRemoved()
attributeReplaced()

  • 세션의 속성 추가/제거/수정 이벤트 발생시 처리

 

ServletContextListener

contextInitialized()
contextDestroyed()

  • 컨텍스트 객체의 생성/소멸 이벤트 발생시 처리

 

HttpSessionActivationListener

sessionDidActivate()
sessionWillPassivate()

  • 세션의 활성화/비활성화 이벤트 발생시 처리






HttpSessionBindingListener 활용법


로그인 폼

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form name="frmLogin" method="post" action="login2" encType="UTF-8">
		아이디 : <input type="text" name="user_id"><br>
		비밀번호 : <input type="password" name="user_pw"><br>
		<input type="submit" value="로그인">
		<input type="reset" value="다시 입력">
	</form>
</body>
</html>


로그인

package sec04.ex01;

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

	ServletContext context = null;
	List user_list = new ArrayList(); //로그인한 접속자 ID를 저장하는 리스트

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		context = getServletContext();
		PrintWriter out = response.getWriter();
		HttpSession session = request.getSession();
		
		String user_id = request.getParameter("user_id");
		String user_pw = request.getParameter("user_pw");
		
        // 전송된 아이디, 비밀번호 세션 등록
		LoginImpl loginUser = new LoginImpl(user_id, user_pw);
		if (session.isNew()) { // 새 세션(웹페이지마다의 세션(크롬, 익스 등))
			session.setAttribute("loginUser", loginUser);
			// 아이디, 비번 리스트에 저장
            // 리스트를 웹앱 내에서 쓸 수 있도록 넘겨줌
			user_list.add(user_id);
			context.setAttribute("user_list", user_list);
		}
		
		out.println("<html><body>");
		out.println("아이디는 "+loginUser.user_id+"<br>");
		out.println("총 접속자수는"+LoginImpl.total_user+"<br>");
		out.println("접속 아이디:<br>");
        
        // 접속한 리스트를 전부 가져와 나열 
		List list = (ArrayList)context.getAttribute("user_list");
		for(int i=0; i<list.size(); i++) {
			out.println(list.get(i)+"<br>");
		}
		out.println("<a href = 'logout?user_id="+user_id+"'>로그아웃</a>");
		out.println("</body></html>");
	}

}


로그아웃

package sec04.ex01;

@WebServlet("/logout")
public class LogoutTest extends HttpServlet {

	ServletContext context;
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
		doHandle(request,response);
	}
	
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
		doHandle(request,response);
	}
	
	protected void doHandle(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		context = getServletContext(); //페이지에 대한 서블릿 실행환경 정보를 담음
		HttpSession session = request.getSession();
		
		String user_id = request.getParameter("user_id");
        // 세션 종료
		session.invalidate();
		
        // 받아온 리스트 값 꺼내기
		List user_list = (ArrayList)context.getAttribute("user_list");
        // 로그아웃한 id를 삭제. 해당 아이디가 비어있는 user_list 로 저장.
		user_list.remove(user_id);
		context.removeAttribute("user_list");
		context.setAttribute("user_list", user_list);
		
		out.println("<br>로그아웃 했습니다.");
	}

}


리스너

package sec04.ex01;

@WebListener
public class LoginImpl implements HttpSessionBindingListener {
	
	String user_id;
	String user_pw;
	static int total_user = 0;
	
    public LoginImpl() {
    }
    
    public LoginImpl(String user_id, String user_pw) {
    	this.user_id = user_id;
    	this.user_pw = user_pw;
    }
    
    @Override
    public void valueBound(HttpSessionBindingEvent arg0) {
    	System.out.println("세션 생성");
    	++total_user;
    }
    
    @Override
    public void valueUnbound(HttpSessionBindingEvent arg0) {
    	System.out.println("세션 소멸");
    	--total_user;
    }
}


결과값

 

'Spring' 카테고리의 다른 글

[Spring] SqlSession, 트랜잭션  (0) 2022.10.04
[Spring] 쿠키, 세션, ajax  (0) 2022.08.25
[Spring] 스프링과 서블릿, 바인딩  (0) 2022.08.24
[Spring] servlet  (0) 2022.08.18
[Spring] 로그인, 스프링 시큐리티  (0) 2022.08.18