λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
JSP

[JSP] Session

by μ½”λ”©ν•˜λŠ” λΆ•μ–΄ 2021. 2. 9.
λ°˜μ‘ν˜•

β–Ά μ„œλΈ”λ¦Ώμ—μ„œ μ„Έμ…˜ μ‚΄νŽ΄λ³΄κΈ°

​

*μ„Έμ…˜μ˜ κ°œλ…

μ„Έμ…˜μ˜ κ°œλ…μ„ μ΄ν•΄ν•˜λ €λ©΄ μš°μ„  HTTP ν”„λ‘œν† μ½œμ˜ νŠΉμ„±λΆ€ν„° 이해해야 ν•œλ‹€. HTTP ν”„λ‘œν† μ½œμ˜ λŒ€ν‘œμ μΈ νŠΉμ§• μ€‘μ˜ ν•˜λ‚˜λŠ” μƒνƒœλ₯Ό μœ μ§€ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” 것이닀. 즉, ν΄λΌμ΄μ–ΈνŠΈκ°€ ν•œ 번 μš”μ²­μ„ ν•˜κ³  μ„œλ²„μ—μ„œ 응닡을 ν•˜λ©΄ ν•΄λ‹Ή ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„μ™€μ˜ 연결은 μœ μ§€λ˜μ§€ μ•ŠλŠ”λ‹€λŠ” νŠΉμ§•μ΄ μžˆλ‹€.

​

μœ„ κ·Έλ¦Όμ—μ„œ 확인할 수 μžˆλ“―μ΄ HTTP ν”„λ‘œν† μ½œμ€ μƒνƒœλ₯Ό μœ μ§€ν•˜μ§€ μ•ŠλŠ” νŠΉμ„±μ΄ 있기 λ•Œλ¬Έμ— 첫 번째 ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­μ— λŒ€ν•΄μ„œ μ„œλ²„μ—μ„œ 응닡을 λ‚΄λ € 보내면 λ˜‘κ°™μ€ ν΄λΌμ΄μ–ΈνŠΈκ°€ 두 번째 μš”μ²­μ„ ν–ˆμ„ λ•Œ μ„œλ²„μ—μ„œλŠ” 두 번째 μš”μ²­μ„ ν•œ ν΄λΌμ΄μ–ΈνŠΈκ°€ 첫 번째 μš”μ²­μ„ ν•œ ν΄λΌμ΄μ–ΈνŠΈμž„μ„ μΈμ‹ν•˜μ§€ λͺ»ν•œλ‹€.

HTTP의 이런 νŠΉμ§• λ•Œλ¬Έμ— μ›Ή μ„œλ²„λŠ” λ™μ‹œμ— μ—¬λŸ¬ 개의 μš”μ²­μ„ 효과적으둜 μ²˜λ¦¬ν•  수 μžˆλŠ” 것이닀. κ·Έλ ‡μ§€λ§Œ HTTP ν”„λ‘œν† μ½œμ˜ μƒνƒœλ₯Ό μœ μ§€ν•˜μ§€ μ•ŠλŠ” νŠΉμ§• λ•Œλ¬Έμ— 둜그인, μž₯λ°”κ΅¬λ‹ˆ λ“± μƒνƒœκ°€ μœ μ§€λ˜μ–΄μ•Ό ν•  ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜κΈ°λŠ” νž˜λ“€λ‹€.

​

이 단점을 λ³΄μ™„ν•˜κΈ° μœ„ν•œ 방법이 λ°”λ‘œ μ„Έμ…˜μ΄λ‹€. μ„Έμ…˜μ€ μ„œλΈ”λ¦Ώμ—μ„œ ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„μ˜ μƒνƒœλ₯Ό μœ μ§€ν•˜κΈ° μœ„ν•΄ μ œκ³΅λ˜λŠ” API(Application Programming Interface)이닀. μ„œλΈ”λ¦Ώ κ°œλ…μ΄ 적용되면 μœ„μ˜ μš”μ²­ 처리 단계가 λ‹€μŒκ³Ό 같이 μˆ˜μ •λœλ‹€.

β€‹μ„Έμ…˜ κΈ°λŠ₯을 μ΄μš©ν•˜λ©΄ ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­μ— λŒ€ν•œ 응닡을 ν•  λ•Œ μ„œλ²„μ—μ„œλŠ” μ€‘λ³΅λ˜μ§€ μ•ŠλŠ” μ„Έμ…˜ 아이디λ₯Ό ν΄λΌμ΄μ–ΈνŠΈλ§ˆλ‹€ λΆ€μ—¬ν•΄μ„œ 응닡에 같이 보낸닀. 그리고 이 μ„Έμ…˜ μ•„μ΄λ””λŠ” ν΄λΌμ΄μ–ΈνŠΈμ˜ μΏ ν‚€ μ €μž₯μ†Œμ— μ €μž₯되게 되고 ν΄λΌμ΄μ–ΈνŠΈκ°€ λ‹€μ‹œ μš”μ²­μ„ ν•˜λ©΄ 이 μ„Έμ…˜ 아이디가 μš”μ²­μ— 같이 μ „μ†‘λœλ‹€. μ„œλ²„λŠ” μš”μ²­μ— μ „μ†‘λ˜μ–΄μ˜€λŠ” μ„Έμ…˜ 아이디λ₯Ό νŒλ³„ν•˜μ—¬ 두 번째 μš”μ²­μ„ ν•œ ν΄λΌμ΄μ–ΈνŠΈκ°€ 첫 번째 μš”μ²­μ„ ν•œ ν΄λΌμ΄μ–ΈνŠΈμž„μ„ 확인할 수 μžˆλ‹€.

​

​​

​

*κ°„λ‹¨ν•œ μ„Έμ…˜ 예제

κ°„λ‹¨ν•˜κ²Œ ν΄λΌμ΄μ–ΈνŠΈκ°€ μš”μ²­μ„ ν–ˆμ„ λ•Œ μ„Έμ…˜ 객체λ₯Ό μƒμ„±ν•΄μ„œ μžμ‹ μ˜ μ„Έμ…˜ μ˜μ—­μ— 이름을 μ†μ„±μœΌλ‘œ μ €μž₯ν•˜κ³ , μ„Έμ…˜μ— μ €μž₯λ˜μ–΄ μžˆλŠ” 이름 속성 값을 좜λ ₯ν•΄ 보도둝 ν•˜κ² λ‹€.

μš°μ„  μ„Έμ…˜ μžμ‹ μ˜ μ„Έμ…˜ μ˜μ—­μ— 이름 속성을 μ €μž₯ν•˜λŠ” μ½”λ“œλ₯Ό μž‘μ„±ν•΄ 보자. μ„œλΈ”λ¦Ώμ—μ„œλŠ” μ„Έμ…˜μ„ λ‹€λ£° 수 μžˆλŠ” HttpSession μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ œκ³΅ν•˜κ³  μžˆλ‹€. μ„Έμ…˜ κ°μ²΄λŠ” λ‹€μŒ λ©”μ„œλ“œλ₯Ό μ΄μš©ν•΄μ„œ μ–»μ–΄μ˜¬ 수 μžˆλ‹€.

​

-HttpServletRequest.getSession(true) : ν•΄λ‹Ή ν΄λΌμ΄μ–ΈνŠΈμ— μ„Έμ…˜μ΄ ν• λ‹Ήλ˜μ–΄ 있으면, 즉, 이전 μš”μ²­μ— μ˜ν•΄μ„œ 이미 μ„Έμ…˜μ΄ μƒμ„±λ˜μ–΄ 있으면 기쑴에 μƒμ„±λ˜μ–΄ μžˆλŠ” μ„Έμ…˜ 객체의 레퍼런슀λ₯Ό λ°˜ν™˜ν•˜κ³ , μƒμ„±λ˜μ–΄ μžˆμ§€ μ•ŠμœΌλ©΄, 즉, 첫 번째 μš”μ²­μ΄λ©΄ μƒˆλ‘­κ²Œ μ„Έμ…˜ 객체λ₯Ό μƒμ„±ν•˜λŠ” λ©”μ„œλ“œ.

νŒŒλΌλ―Έν„° 값을 μƒλž΅ν–ˆμ„ 경우, 즉, HttpServletRequest.getSession( )도 같은 μ˜λ―Έμ΄λ‹€. 즉, κΈ°λ³Έ νŒŒλΌλ―Έν„° 값은 true이닀.

​

-HttpServletRequest.getSession(false) : 기쑴에 ν΄λΌμ΄μ–ΈνŠΈμ— λŒ€ν•΄μ„œ μ„Έμ…˜ 객체가 μƒμ„±λ˜μ–΄ 있으면 κΈ°μ‘΄ μƒμ„±λœ μ„Έμ…˜μ˜ 레퍼런슀λ₯Ό λ°˜ν™˜ν•˜κ³ , 기쑴에 μ„Έμ…˜ 객체가 μƒμ„±λ˜μ–΄ μžˆμ§€ μ•ŠμœΌλ©΄ μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚€λŠ” λ©”μ„œλ“œμ΄λ‹€.

​

​​

SetNameServlet.java

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

		HttpSession session = request.getSession();
		session.setAttribute("name", "μ˜€μ •μ›");
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter out = response.getWriter();
		out.println("<h1>이름저μž₯</h1>");
}

이제 ν•΄λ‹Ή μ„Έμ…˜ μ˜μ—­μ— μ €μž₯λ˜μ–΄ μžˆλŠ” name 속성 값을 κ°€μ Έμ™€μ„œ 좜λ ₯ν•˜λŠ” μ„œλΈ”λ¦Ώμ„ μž‘μ„±ν•΄λ³΄μž.

​​

​

GetNameServlet.java

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	
		HttpSession session = request.getSession();
		String name = (String)session.getAttribute("name");
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter out = response.getWriter();
		out.println("<h1>name="+name+"</h1>");
}

 

<μ‹€ν–‰ κ²°κ³Ό>

β€‹μ„Έμ…˜ κ°μ²΄λŠ” ν΄λΌμ΄μ–ΈνŠΈλ§ˆλ‹€ ν•˜λ‚˜μ”© ν• λ‹Ήλ˜λ©΄ λΈŒλΌμš°μ €λ₯Ό μ’…λ£Œν•˜κ³  μ„Έμ…˜μ—μ„œ λ‚˜κ°ˆ λ•ŒκΉŒμ§€λŠ” κ³„μ†ν•΄μ„œ μ„Έμ…˜μ΄ μœ μ§€λœλ‹€λŠ” 것을 μ•Œ 수 μžˆλ‹€. 이 μ„Έμ…˜μ˜ κΈ°λŠ₯을 μ΄μš©ν•΄μ„œ μƒνƒœκ°€ μœ μ§€λ˜μ–΄μ•Ό ν•˜λŠ” ν”„λ‘œκ·Έλž¨, 즉 둜그인 ν”„λ‘œκ·Έλž¨, μž₯λ°”κ΅¬λ‹ˆ ν”„λ‘œκ·Έλž¨ 등을 κ΅¬ν˜„ ν•  수 μžˆλ‹€.

그럼 μ„Έμ…˜ κΈ°λŠ₯을 μ΄μš©ν•΄μ„œ 둜그인 ν”„λ‘œκ·Έλž¨μ„ κ΅¬ν˜„ν•΄ 보도둝 ν•˜μž.

​

​

login.jsp

<%@ 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>
<form action="sessionLogin" method="post">
      아이디:<input type="text" name="id"/>
      λΉ„λ°€λ²ˆν˜Έ:<input type="password" name="passwd"/><br>
      <input type="submit" value="둜그인"/>
</form>
</body>
</html>

 

 

menu.jsp

<%@ 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>
<%
	String id = (String)session.getAttribute("id");
%>
<body>
	<%
		if (id == null) {
	%>
	<a href="login.jsp">둜그인</a>
	<%
		} else {
	%>
	<%=id %> λ‹˜ ν™˜μ˜ν•©λ‹ˆλ‹€.
	<%
		}
	%>
</body>
</html>

 

 

SessionLoginServlet.java

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

		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter out = response.getWriter();
		String id = request.getParameter("id");
		String passwd = request.getParameter("passwd");
		if(id.equals("java")&&passwd.equals("1111")) {
			HttpSession session = request.getSession();
			session.setAttribute("id", id);
			RequestDispatcher dispatcher = request.getRequestDispatcher("menu.jsp");
			dispatcher.forward(request, response);
		}
		else {
			out.println("<script>");
			out.println("alert('μ•„μ΄λ””λ‚˜ λΉ„λ°€λ²ˆν˜Έκ°€ μΌμΉ˜ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.')");
			out.println("history.back()");
			out.println("</script>");
		}
	}

 

<μ‹€ν–‰ κ²°κ³Ό>

μ„±κ³΅μ‹œ

 

μ‹€νŒ¨μ‹œ

 

λ°˜μ‘ν˜•

λŒ“κΈ€