프로그래밍 언어/자바 웹

세션을 이용한 로그인 정보 바인딩 실습

· 코딩마이데이

1. 실습하기 전에 해야할 일이 있습니다. 톰캣이 종료된 후에도 세션이 메모리에서 삭제되지 않는 경우가 있으므로 톰캣 설정 파일인 context.xml을 열어 <Manager pathname="" /> 태그의 주석을 해제해야 합니다.

context.xml의 Manager 태그 주석 해제

 

2. 다음과 같이 실습 파일을 준비합니다.

실습 파일 위치

 

 

3. 로그인창에서 ID와 비밀번호를 입력한 후 서블릿으로 전송할 수 있도록 login2.html 파일을 작성합니다.

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form name="frmLogin" method="post" action="login" 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>

 

4. SessionTest4 클래스를 다음과 같이 작성합니다. 로그인창에서 로그인할 경우 ID와 비밀번호를 가져오고, 최초 요청 시 세션에 setAttribute() 메서드를 이용해 user_id로 사용자 ID를 바인딩하도록 구현합니다. <a> 태그를 이용해 재요청하고 세션의 getSttribute() 메서드를 이용하여 user_id 값을 가져와 로그인 여부를 확인합니다.

package sec03.ex04;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;

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

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

	private void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		HttpSession session = request.getSession();
		String user_id = request.getParameter("user_id");
		String user_pw = request.getParameter("user_pw");
		
		if (session.isNew()) {
			if (user_id != null) {
				session.setAttribute("user_id", user_id);
				out.println("<a href='login'>로그인 상태 확인</a>");
			} else {
				out.print("<a href='login2.html'>다시 로그인 하세요!!</a>");
				session.invalidate();
			}
		} else {
			user_id = (String) session.getAttribute("user_id");
			if (user_id != null && user_id.length() != 0) {
				out.print("안녕하세요 " + user_id + "님!!!");
			} else {
				out.print("<a href='login2.html'>다시 로그인 하세요!!</a>");
				session.invalidate();
			}
		}
	}
	
	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);
	}
}

 

5. 로그인창 요청 후 ID와 비밀번호를 입력하고 전송합니다.

로그인창에서 로그

 

6. 최초 로그인 시 세션에 ID를 바인딩합니다.

로그인 후 다시 /login으로 재요청

 

7. 다시 로그인 상태 확인을 클릭해 /login으로 재요청하면 현재 로그인 상태를 출력합니다.

/login으로 재요청 시 로그인 상태 출력

 

8. 톰캣 재실행 후 로그인창으로 거치지 않고 바로 /login으로 요청하면 세션에 ID가 없으므로 "다시 로그인 하세요!!"라는 메시지 가 출력됩니다.

로그인창을 거치지 않고 /login 요청 시 결과