<< 학습 목표 >>

1. 다른 서블릿에서 필요한 정보를 세션에 저장할 수 있다.

2. 세션에 저장된 정보를 꺼내 활용할 수 있다.


전 글에서 세션에 저장해둔 로그인 정보를 활용 해보자

 

이번에 우리가 할 것은 다음과 같음

1. 로그인을 한 사용자가 메인 페이지에 접속했다면 "! (nickname)님 환영합니다 !" 를 출력

2. 회원 가입을 한 사용자의 전체 정보를 세션에 저장해 회원 가입 겸 로그인 성공 처리

3. 회원 가입 성공 페이지에 접속했다면 "! (nickname)님 가입되었습니다 !" 를 출력

 

4. 로그인 상태를 확인하는 서블릿에서 확인 방식 변경

 

이전까지는 하나씩 수정한 후 서버를 켜 확인했지만

이번에는 4번까지 모두 다 진행한 후 서버를 켜고 확인하자


<< 1. 로그인을 한 사용자가 메인 페이지에 접속했다면 "! (nickname)님 환영합니다 !" 를 출력 >>

 

이와 같은 작업을 하려면 메인 페이지를 보여주는 서블릿에서 로그인 상태 정보를 꺼내는 방식 변경해야 하고 로그인에 성공했다면 ! (nickname)님 환영합니다 ! 를 출력하도록 해야함

더보기

메인 페이지를 보여주는 서블릿(member 패키지 -> MemberMain 서블릿)의 코드를 아래와 같이 수정

package member;

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("/member")
public class MemberMain extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		HttpSession session = request.getSession();
		
		MemberDto loginMember = null;
		if(session.getAttribute("member") != null) {
			loginMember = (MemberDto) session.getAttribute("member");
		}

		response.setCharacterEncoding("UTF-8");
		PrintWriter pw = response.getWriter();
		
		pw.print("<!DOCTYPE html>");
		pw.print("<html>");
		pw.print("<head>");
		pw.print("	<meta charset=\"UTF-8\">");
		pw.print("	<title>연습 프로젝트</title>");
		pw.print("	<link rel=\"stylesheet\" type=\"text/css\" href=\"/css/public/common.css\">");
		pw.print("	<link rel=\"stylesheet\" type=\"text/css\" href=\"/css/index.css\">");
		pw.print("</head>");
		pw.print("<body>");
		pw.print("	<header>&#60;&#60; 메인 &#62;&#62;</header>");
		pw.print("	<main>");
		pw.print("		<ul>");
		
		if(loginMember != null) {
			pw.print("			<li><h3>! "+loginMember.getNickname()+" 님 환영합니다 !</h3></li>");
			pw.print("			<li><a href=\"/member/logout\">로그아웃</a></li>");
			pw.print("			<li><a href=\"/member/update\">회원 정보 수정</a></li>");
			pw.print("			<li><a href=\"#\">회원 탈퇴</a></li>");
		} else {
			pw.print("			<li><a href=\"/member/join\">회원가입</a></li>");
			pw.print("			<li><a href=\"/member/login\">로그인</a></li>");
		}
		
		pw.print("		</ul>");
		pw.print("	</main>");
		pw.print("</body>");
		pw.print("</html>");
	}
}

 

세션에서 로그인한 사용자의 전체 정보를 꺼내야하므로 이를 담을 수 있는 loginMember 객체 선언(1)

세션에 로그인한 사용자의 전체 정보가 들어있다면 꺼내 loginMember 객체에 저장

 

로그인한 사용자의 정보가 있다면(2) 로그인 화면에서 ! (nickname) 님 환영합니다 ! 를 출력



<< 2. 회원 가입을 한 사용자의 전체 정보를 세션에 저장해 회원 가입 겸 로그인 성공 처리 >>

 

이와 같은 작업을 하려면 회원 가입 서블릿에서 회원 가입에 성공했다면 세션에 로그인한 사용자의 전체 정보를 저장해야함

더보기

<< 회원 가입 서블릿 (member 패키지 -> MemberJoin 서블릿) 을아래와 같이 수정 >>

수정할 부분은 적으나 코드는 매우 길기 때문에 수정할 부분만 가져옴

// ...

if(result.equals("OK")) {
	// 상태 코드를 설정하지 않으면 자동으로 200으로 설정되므로
	// 설정 생략
	// response.setStatus(200);
	
	HttpSession session = request.getSession();
	session.setAttribute("member", member);
} else if(result.startsWith("duplicate")) {
	response.setStatus(409);
} else {
	response.setStatus(500);
}

// ...

 

회원 가입에 성공했을 경우 세션에 사용자의 전체 정보를 저장(1)

로그인했을 때와 같은 방법으로 세션에 사용자의 전체 정보를 저장했으므로 로그인 성공 처리가 된 것



<< 3. 회원 가입 성공 페이지에 접속했다면 "! (nickname)님 환영합니다 !" 를 출력 >>

 

이와 같은 작업을 하려면 회원 가입 완료 페이지로 포워딩 하는 서블릿에서 회원 가입에 성공했다면 세션에 저장된 사용자의 전체 정보를 꺼내 보여줘야함

 

이때 페이지는 동적인 페이지임

왜? 회원 가입 하는 사람들 마다 닉네임이 다르므로...

쿠키에 사용자의 전체 정보가 저장되 있었다면 HTML 페이지 그대로, JS를 추가해 닉네임을 보여줄 수 있겠지만 세션에 저장된 사용자의 전체 정보를 꺼내 그 닉네임을 출력해야하므로 Servlet에서 동적인 페이지를 출력해야함

더보기

<< 회원 가입 완료 페이지로 포워딩하는 서블릿(member 패키지 -> MemberJoinSuccess 서블릿) >>

package member;

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("/member/joinSuccess")
public class MemberJoinSuccess extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		HttpSession session = request.getSession();
		
		MemberDto loginMember = null;
		if(session.getAttribute("member") != null) {
			loginMember = (MemberDto) session.getAttribute("member");
		}
		
		if(loginMember != null) {
			response.setCharacterEncoding("UTF-8");
			
			PrintWriter pw = response.getWriter();
			pw.print("<!DOCTYPE html>");
			pw.print("<html>");
			pw.print("<head>");
			pw.print("	<meta charset=\"UTF-8\">");
			pw.print("	<title>연습 프로젝트</title>");
			pw.print("	<link rel=\"stylesheet\" type=\"text/css\" href=\"/css/public/common.css\">");
			pw.print("	<link rel=\"stylesheet\" type=\"text/css\" href=\"/css/member/joinSuccess.css\">");
			pw.print("</head>");
			pw.print("<body>");
			pw.print("	<header>&#60;&#60; 회원 가입 완료 &#62;&#62;</header>");
			pw.print("	<main>");
			pw.print("		<div id=\"content_wrapper\">");
			pw.print("			<h1>! "+loginMember.getNickname()+"님 가입되었습니다 !</h1>");
			pw.print("			<div id=\"image_wrapper\">");
			pw.print("				<div><img src=\"/images/signupSuccess_left.png\"></div>");
			pw.print("				<div><img src=\"/images/signupSuccess_right.png\"></div>");
			pw.print("			</div>");
			pw.print("			<a href=\"/member/login\">로그인 페이지로 이동</a>");
			pw.print("		</div>");
			pw.print("	</main>");
			pw.print("</body>");
			pw.print("</html>");
		} else {
			response.sendRedirect("/member");
		}
	}
	
}

 

세션에 저장된 사용자의 전체 정보를 저장할 loginMember 객체 생성(1)

세션에 사용자의 전체 정보가 저장되있다면 꺼내서 loginMember 객체에 저장

 

세션에 사용자의 전체 정보가 저장되있다면 회원 가입 성공 페이지에 그 사용자의 닉네임을 출력함(2)


 

이렇게 했을 경우 생기는 단점은 로그인을 한 사람이 회원 가입 성공 페이지의 URL로 직접 접근했을 때도 회원 가입에 성공했다는 메세지를 볼 수 있다는 것

 

회원 가입 후 회원 가입 성공 페이지로 왔을 경우에만 회원 가입 성공 메세지를 보여주고 싶을 때는 회원 가입 서블릿에서 추가로 여러분만의 상태 정보, 이를 테면 successJoin=true, 를 저장한 뒤 회원 가입 성공 페이지에서 successJoin도 함께 꺼내 2차로 확인하면 됨

 

로그인한 사용자가 회원 가입 성공 페이지로 왔다고 해서 서비스에 심각한 문제가 생기는건 아니므로 이대로 두자


<< 4. 로그인 상태를 확인하는 서블릿에서 확인 방식 변경 >>

각 페이지로 포워딩 해주는 서블릿에서 로그인 여부를 확인하는 부분이 있다면 해당 부분들을 모두 바꿔야함

 

ㄱ. 회원 가입 페이지 포워딩 서블릿

 

ㄴ. 로그인 페이지 포워딩 서블릿

 

이제 서버를 시작하고 메인 페이지, 회원 가입, 회원 가입 완료, 로그인 페이지를 하나씩 확인해보자

728x90
LIST