개발/JSP 게시판 만들기

[JSP 게시판 만들기] 7강 접속한 회원 세션 관리하기

ee2ee2 2021. 11. 4. 22:52
728x90
반응형

참고유튜브

 

이번에는 "세션 관리"를 해볼 것이다.

세션을 간단하게 말하자면 현재 접속한 회원에게 할당해 주는 고유한 ID라고 생각하면 된다.

세션에 대해 정리해서 글을 따로 올릴 예정이다.


가장 먼저! 로그인/회원가입 한 사용자들은 이미 로그인이 되어있는 상태이므로 세션할당이 필요하다.

이후, 로그인/회원가입 페이지는 다시 접근할 필요가 없으므로, if 문을 통해 main페이지로 이동시키는 로직을 추가하였다. loginAction.jsp / joinAction.jsp 페이지 모두 동일 로직!

loginAction.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="USER.UserDAO" %>
<%@ page import="java.io.PrintWriter" %>
<% request.setCharacterEncoding("UTF-8"); %>
<jsp:useBean id="USER" class="USER.User" scope="page"/>
<jsp:setProperty name="USER" property="userID"/>
<jsp:setProperty name="USER" property="userPW"/>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content= "text/html; charset=UTF-8">
<title>JSP 게시판 웹 사이트</title>
</head>
<body>
	<%
		//로그인이 되어있으면, 로그인 창에 접근을 못하게 하기 위해 세션 확인을 해주는 부분
		String userID = null;
		if(session.getAttribute("userID") != null){	//로그인 혹은 회원가입을 통해 이미 세션이 있는 상태라면,
			userID = (String) session.getAttribute("userID"); // userID 세팅
		}
		
		if(userID != null){	//userID가 null이 아니라는 것은 이미 로그인 한 것!
			PrintWriter script = response.getWriter();
			script.println("<script>");
			script.println("alert('이미 로그인 되어있는 사용자 입니다.' + userID + ')'");
			script.println("location.href = 'main.jsp'");
			script.println("</script>");	
		}
		
		UserDAO userDao = new UserDAO();
		int result = userDao.login(USER.getUserID(), USER.getUserPW()); 
		
		if(result == 1){
			session.setAttribute("userID", USER.getUserID());	//USER의 ID를 세션값으로 설정해준다.
			PrintWriter script = response.getWriter();
			script.println("<script>");
			script.println("location.href = 'main.jsp'");
			script.println("</script>");	
		} else if(result == 0){
			PrintWriter script = response.getWriter();
			script.println("<script>");
			script.println("alert('비밀번호가 일치하지 않습니다.')");
			script.println("history.back()");
			script.println("</script>");	
		} else if(result == -1){
			PrintWriter script = response.getWriter();
			script.println("<script>");
			script.println("alert('존재하지 않는 아이디입니다.')");
			script.println("history.back()");
			script.println("</script>");	
		} else if(result == -2){
			PrintWriter script = response.getWriter();
			script.println("<script>");
			script.println("alert('데이터베이스 오류가 발생했습니다.')");
			script.println("history.back()");
			script.println("</script>");	
		}
	%>
</body>
</html>

joinAction.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="USER.UserDAO" %>
<%@ page import="java.io.PrintWriter" %>
<% request.setCharacterEncoding("UTF-8"); %>
<jsp:useBean id="USER" class="USER.User" scope="page"/>
<jsp:setProperty name="USER" property="userID"/>
<jsp:setProperty name="USER" property="userPW"/>
<jsp:setProperty name="USER" property="userName"/>
<jsp:setProperty name="USER" property="userGender"/>
<jsp:setProperty name="USER" property="userEmail"/>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content= "text/html; charset=UTF-8">
<title>JSP 게시판 웹 사이트</title>
</head>
<body>
	<%
		//로그인이 되어있으면, 로그인 창에 접근을 못하게 하기 위해 세션 확인을 해주는 부분
		String userID = null;
		if(session.getAttribute("userID") != null){	//로그인 혹은 회원가입을 통해 이미 세션이 있는 상태라면,
			userID = (String) session.getAttribute("userID"); // userID 세팅
		}
		
		if(userID != null){	//userID가 null이 아니라는 것은 이미 로그인 한 것!
			PrintWriter script = response.getWriter();
			script.println("<script>");
			script.println("alert('이미 로그인 되어있는 사용자 입니다.' + userID + ')'");
			script.println("location.href = 'main.jsp'");
			script.println("</script>");	
		}
		
		if(USER.getUserID() == null || USER.getUserPW() == null || 
				USER.getUserName() == null || USER.getUserGender() == null || USER.getUserEmail() == null) {
			PrintWriter script = response.getWriter();
			script.println("<script>");
			script.println("alert('모든 칸을 입력해주십시오.')");
			script.println("history.back()");
			script.println("</script>");	
		}
		else {
			UserDAO userDao = new UserDAO();
			int result = userDao.join(USER); 
			
			if(result >= 0){
				session.setAttribute("userID", USER.getUserID());	//USER의 ID를 세션값으로 설정해준다.
				PrintWriter script = response.getWriter();
				script.println("<script>");
				script.println("location.href = 'main.jsp'");
				script.println("</script>");	
			} else if(result == -1){
				PrintWriter script = response.getWriter();
				script.println("<script>");
				script.println("alert('이미 존재하는 아이디입니다.')");
				script.println("history.back()");
				script.println("</script>");	
			}
		}
	%>
</body>
</html>

추가로! 접속한 사용자에게 부여된 세션을 해제하는 방법은? session.invalidate(); 를 통해 세션을 해제한다.

세션을 해제하고, main 페이지로 이동시킨다!

logoutAction.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content= "text/html; charset=UTF-8">
<title>JSP 게시판 웹 사이트</title>
</head>
<body>
	<%
		session.invalidate();	//현재 접속한 회원의 세션을 해제하는 부분
	%>
	
	<script>
		location.href = 'main.jsp';
	</script>
</body>
</html>

이제, main.jsp 파일을 구성해보자!

이때, 로그인 여부(세션 보유 여부)에 따라 사용자에게 보이는 메뉴를 구분하여 설정할 수 있다.

main.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.io.PrintWriter" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content= "text/html; charset=UTF-8">
<!-- 어느 기기에서도 맞춤으로 보이는 반응형 웹에 사용되는 기본 Meta Tag -->
<meta name="viewport" content="width-device-width", initial-scale="1">
<link rel="stylesheet" href="css/bootstrap.css">
<title>JSP 게시판 웹 사이트</title>
</head>
<body>
	<%
		String userID = null;
	
		//로그인한 사용자들이라면, userID에 값이 담기게될 것!
		if(session.getAttribute("userID") != null){
			userID = (String) session.getAttribute("userID");
		}
	%>
	<!-- 전반적인 웹사이트 구성을 나타내는 네비게이션 -->
	<nav class="navbar navbar-default">
		<div class="navbar-header">
			<button type="button" class="navbar-toggle collapsed" 
			data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
				<span class="icon-bar"></span>
				<span class="icon-bar"></span>
				<span class="icon-bar"></span>
			</button>
			<a class="navbar-brand" href="main.jsp"> JSP 게시판 웹 사이트</a>
		</div>
		
		
		<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
			<!-- ul은 리스트를 보여줄 때 쓰는 tag -> 안에 원소는 li로 사용 -->
			<ul class="nav navbar-nav">
				<li class="active"><a href="main.jsp">메인</a>
				<li><a href="boardSite.jsp">게시판</a>
			</ul>
		<%
			//아무도 로그인 되어있지 않을 때만 로그인/회원가입 메뉴를 보이게 하기 위함.
			if(userID == null) { 
		%>
			<ul class="nav navbar-nav navbar-right">
				<li class="dropdown">
					<a href="#" class="dropdown-toggle" data-toggle="dropdown"
					role="button" aria-haspopup="true" aria-expanded="false"> 접속하기 <span class="caret"></span>
					</a>
					<ul class="dropdown-menu">
						<li><a href="login.jsp">로그인</a></li>
						<li><a href="join.jsp">회원가입</a></li>
					</ul>
				</li>
			</ul>
		<%		
			} else { //로그인이 되어있는 사용가자 보는 메뉴
		%>
			<ul class="nav navbar-nav navbar-right">
				<li class="dropdown">
					<a href="#" class="dropdown-toggle" data-toggle="dropdown"
					role="button" aria-haspopup="true" aria-expanded="false"> 회원관리 <span class="caret"></span>
					</a>
					<ul class="dropdown-menu">
						<li><a href="logoutAction.jsp">로그아웃</a></li>
					</ul>
				</li>
			</ul>
		<%
			}
		%>
		</div>
	</nav>
	<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
	<script src="js/bootstrap.js"></script>
</body>
</html>

 

실행 화면>>

로그인 전, 접속하기 메뉴 > 로그인 / 회원가입

로그인 후, 회원관리 메뉴 > 로그아웃

 


다음 시간에는 아직 생성하지 않은 게시판 페이지 디자인을 진행해보겠다!