데이터융합 JAVA응용 SW개발자 기업 채용연계 연수과정 41일차 강의 정리

misung·2022년 5월 12일
0

JSP

쿠키와 세션

쿠키

실습 1. 쿠키 생성하고 확인해보기

cookie_make.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	// 1. 쿠키 객체를 생성 - 생성자의 매개값으로 쿠키의 이름과 저장할 데이터를 입력
	
	String id = "abc1234";

	Cookie idCoo = new Cookie("id_cookie", id);
	Cookie nameCoo = new Cookie("name_cookie", "홍길동");
	
	// 2. 쿠키 클래스의 setter 메서드로 쿠키의 속성을 설정
	nameCoo.setMaxAge(60 * 60);	// 쿠키의 유효 시간 설정 (초 단위) : 1시간 -> 60 * 60
	idCoo.setMaxAge(20);
	
	// 3. http 응답 시 response 객체에 생성된 쿠키를 탑재하여 클라이언트로 전송
	response.addCookie(nameCoo);
	response.addCookie(idCoo);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<a href="cookie_check.jsp">쿠키 확인하기</a>
</body>
</html>

cookie_check.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	// 클라이언트 쪽에서 전송된 쿠키를 가져오는 방법
	Cookie[] cookies = request.getCookies(); // 쿠키 전체를 가져오므로 Cookie[] 로 넘어온다.
	boolean flag = false; // 쿠키의 존재 유무를 파악할 변수
	
	// 체크 안하면 nullpointerexception 발생함
	if (cookies != null) {
		for (Cookie c : cookies) {
			if (c.getName().equals("id_cookie")) {
				out.print("<h3>아이디 쿠키가 존재합니다</h3>");
				String value = c.getValue(); // 쿠키 내부의 값을 얻어오는 메서드 getValue
				out.print("쿠키의 값 : " + value);
				flag = true;
				break;
			}
		}
		if (!flag) {
			out.print("<h3>아이디 쿠키가 사라졌거나 존재하지 않습니다.</h3>");
		}
	}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	
</body>
</html>

쿠키를 만들 때는 Cookie 클래스를 사용해서 객체를 만든다.

쿠키는 내용으로 String 형태의 문자열을 가질 수 있으며, 문자열에는 공백이 허용되지 않는다.

setMaxAge() 함수를 통해 쿠키의 유효 시간을 초 단위로 설정할 수 있다.

http 응답 시, response 객체의 addCookie() 함수를 사용해서 객체에 생성된 쿠키를 탑재하여 클라이언트로 전송할 수 있다.

그렇게 전송된 쿠키는 쿠키 배열인 Cookie[] 형태로 전달된다. 이를 request.getCookies() 함수를 사용해 쿠키 전체를 가져올 수 있다.

가져온 쿠키가 있나 없나 확인을 하는 과정을 거쳐야 하고, 거치지 않는 경우 nullpointerexception이 발생할 여지가 있다.

for each문으로 쿠키 배열을 순회하며 일치하는 ID를 찾고, getValue() 함수를 통해 쿠키 내부의 값을 얻어오면 된다.

실습 2. 쿠키로 로그인 페이지 구성하기

cookie_login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%--
       - 생성된 login_cookie 쿠키를 검색하여 쿠키가 이미 존재한다면
        로그인 폼 대신 브라우저에 "이미 로그인한 사용자입니다." 를 출력 후
        welcome 페이지로 이동할 수 있는 링크를 제공하세요.
        
       - login_cookie가 없는 사용자는 로그인 입력창이 등장하도록 구성하세요.
     --%>   
<% 
     Cookie[] cookies = request.getCookies();
     boolean flag = false;
     String userId = ""; // 아이디 기억하기 쿠키에서 값을 꺼내 채울 변수
     
     if (cookies != null) {
    	 for (Cookie c : cookies) {
    		 if (c.getName().equals("login_cookie")) {
    			 flag = true;
    			 break;
    		 }
    		 if (c.getName().equals("remember_id")) {
    			 userId = c.getValue();
    		 }
    	 }
     }
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<% if (!flag) { %>

	<form action="cookie_login_con.jsp" method="post">
		<input type="text" name="id" size="10" placeholder="ID" value="<%=userId %>">
		<input type="checkbox" name="id_remember" value="true"> <small style="font-size:0.7em">아이디 기억하기</small> <br>
		<input type="password" name="pw" size="10" placeholder="PW"> <br>
		<input type="submit" value="로그인">
	</form>
	
<% } else { %>

	<h1>이미 로그인한 사용자입니다.</h1>
	<a href="cookie_welcome.jsp">웰컴 페이지로 이동</a>
	
<% } %>
</body>
</html>

cookie_login_con.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	request.setCharacterEncoding("utf-8");

	String id = request.getParameter("id");
	String pw = request.getParameter("pw");
	
	if (id.equals("abc1234") && pw.equals("aaa1111")) {
		Cookie loginCoo = new Cookie("login_cookie", id);
		loginCoo.setMaxAge(5);
		response.addCookie(loginCoo);
		
		// 사용자가 아이디 기억하기 체크박스를 체크한 경우
		if (request.getParameter("id_remember") != null) {
			Cookie idMemory = new Cookie("remember_id", id);
			idMemory.setMaxAge(30);
			response.addCookie(idMemory);
		}
		
		response.sendRedirect("cookie_welcome.jsp");
	} else {
		response.sendRedirect("cookie_login.jsp");
	}
%>

cookie_welcome.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	Cookie[] cookies = request.getCookies();
	String userId = null;
	
	if (cookies != null) {
		for (Cookie c : cookies) {
			if (c.getName().equals("login_cookie")) {
				userId = c.getValue();
				break;
			}
		}
	}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<% if (userId != null) { // 아직 로그인 중 %>
	<p>
		<%=userId %>님 환영합니다!<br>
		<a href="cookie_login.jsp">로그인 화면으로</a>
	</p>
<% } else { // 애초에 로그인을 안 했거나, 로그인 시간 만료%> 
	<p>
		시간이 지나 자동 로그아웃 처리되었습니다. <br>
		<a href="cookie_login.jsp">로그인 화면으로</a>
	</p>
<% } %>

</body>
</html>

cookie_login.jsp부터 시작한다.
해당 페이지에서 폼을 채우고, 입력을 완료한 경우 POST로 데이터가 cookie_login_con.jsp 로 전송된다.

con 페이지에서는 id, pw가 둘 다 일치한 경우 로그인 상태를 유지시켜 줄 loginCoo 쿠키를 5초의 유효시간을 넣어 생성해주고 response 로 클라이언트에 loginCoo 라는 이름의 쿠키를 날려준다.

그리고 아이디 기억하기 체크박스가 체크되었다면, idMemory 라는 쿠키를 생성하고 remember_id 라는 id를 갖게 하고 Value는 id 를 준 다음, 30초의 유효시간을 준다. 그리고 response 객체를 통해 클라이언트에 쿠키를 날려준다.

이후 cookie_welcome.jsp로 이동한다.
만약 아이디나 비밀번호 중 어느 하나라도 일치하지 않거나 하는 경우에는 cookie_login.jsp로 리다이렉트된다.

자, welcome 페이지로 이동하기 전에 다시 login.jsp 쪽의 상단 코드를 체크하자.

Cookie[] cookies = request.getCookies();
     boolean flag = false;
     String userId = ""; // 아이디 기억하기 쿠키에서 값을 꺼내 채울 변수
     
     if (cookies != null) {
    	 for (Cookie c : cookies) {
    		 if (c.getName().equals("login_cookie")) {
    			 flag = true;
    			 break;
    		 }
    		 if (c.getName().equals("remember_id")) {
    			 userId = c.getValue();
    		 }
    	 }
     }

아까 로그인에 성공한 경우 아이디 기억하기 체크박스의 체크 유무에 따라 쿠키를 생성하게 되어 있었다.

만약 로그인이 성공해서 쿠키가 생성되어 있었다면, "abc1234" 라는 문자열이 저장되어 있을 것이고, 그걸 꺼내오기 위해 userId 라는 String 문자열을 선언해둔다.

이제 foreach로 Cookie 배열을 순환하고, 거기서 "remember_id" 와 일치하는 쿠키를 찾으면, value를 꺼내와 userId 에 담는다.

그렇게 되면 이제 form 의 id 입력 부분에 로그인이 성공한 id 가 표시되게 된다.

세션

  • 세션도 쿠키와 마찬가지로 서버와의 관계를 유지하기 위한 수단
  • 단, 쿠키와 달리 클라이언트의 특정 위치에 저장되는 것이 아니라, 서버상에 객체 형태로 존재
  • 서버당 하나의 세션 객체를 가질 수 있음 (브라우저 별 서로 다른 세션 사용)
  • 따라서 세션은 서버에서만 접근이 가능하여 보안이 좋고, 저장할 수 있는 데이터에 한계가 없다
  • 세션은 클라이언트의 요청이 발생하면 자동생성되어 고유한 ID값을 클라이언트에 넘겨 주며 이것은 쿠키에 저장된다
  • JSP 에서는 session 이라는 내장 객체를 지원하여 세션의 속성을 설정할 수 있다
<%
 	session.setAttribute("nickname", "홍길동");
 	session.setAttribute("hobbies", new String[]{"축구", "독서", "게임"});
 %>

세션은 setAttribute의 두 번째 매개변수가 Object형으로써, String으로 제한되는 쿠키와는 다르게 지원 자료형이 널널하다.

그리고 둘째 줄을 확인하면, 배열도 전달이 가능하다.

실습 1. 세션 만들고 확인하기

session_make.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%--
	- 세션은 쿠키와 마찬가지로 http 통신 데이터를 유지하기 위한 수단으로 사용
	- 세션에 데이터를 저장할 때는 jsp 내장객체 session이 지원하는
	  setAttribute() 메서드를 사용한다.
	- 해당 메서드의 첫 번째 매개값으로 세션의 이름을 정하고,
	    두 번째로 세션에 저장할 값을 지정한다.
 --%>
 
 <%
 	session.setAttribute("nickname", "홍길동");
 	session.setAttribute("hobbies", new String[]{"축구", "독서", "게임"});
 %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<a href="session_check.jsp">세션 데이터 확인하기</a>
</body>
</html>

session_check.jsp

<%@page import="java.util.Arrays"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	/*
		- 세션에 저장한 데이터는 브라우저 창이 종료될 때 까지 혹은
		세션의 유효시간이 만료되기 전까지 웹 어플리케이션의
		모든 jsp 파일에서 사용이 가능합니다.
		
		- 세션에 저장된 데이터를 가져오려면 session 객체의 메서드
		getAttribute()를 사용하며, 매개값으로 가져올 세션 데이터의
		이름을 적습니다.
	*/
	
	// 반환은 Object형으로 되기 때문에 자료형에 맞춰 다운캐스팅을 진행해야 한다.
	String nick = (String)session.getAttribute("nickname");
	String[] hobbies = (String[])session.getAttribute("hobbies");
	
	out.print(nick + "<br>");
	out.print(Arrays.toString(hobbies) + "<br>");
	out.print("---------------------------<br>");
	
	// 세션의 유효기간 설정
	// 세션의 수명을 따로 지정하지 않는 경우 기본 30분의 유효 시간을 갖는다.
	session.setMaxInactiveInterval(60 * 60); // 초 단위 세션의 유효시간 설정

	// 세션 유효시간 기본은 1800초지만 MAX로 놓는 경우 3600초가 된다.
	int sTime = session.getMaxInactiveInterval();
	out.print("세션의 유효시간: " + sTime + "초 <br>");
	out.print("---------------------------<br>");
	
	// 특정 세션의 데이터를 삭제
	session.removeAttribute("nickname");
	nick = (String)session.getAttribute("nickname");
	out.print("삭제 후 nick의 값: " + nick + "<br>");
	out.print("---------------------------<br>");
	
	// 모든 세션 데이터를 삭제하는 법. (무효화)
	session.invalidate();
	
	// 해당 페이지에서는 더 이상 세션 객체를 사용할 수 없다.
	// 따라서 아래의 코드부터는 에러가 발생한다.
	// 새롭게 요청이 다시 들어오기 전까진, 세션 객체를 사용할 수 없다.
	
	hobbies = (String[])session.getAttribute("hobbies");
	out.print("삭제 후 hobbies의 값 : " + Arrays.toString(hobbies));
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	
</body>
</html>

session_make.jsp 부터 시작한다.

세션을 생성할 때는 setAttribute() 함수를 사용한다.
두 번째로 전달되는 매개 변수는 쿠키와 달리 Object 형으로 전달된다.

이제 세션을 만들었으니 아래의 <a> 태그를 통한 링크를 타고 session_check.jsp로 이동해보자.

session_check.jsp 에는 방금 우리가 make쪽에서 만든 Attribute 두 개 nicknamehobbies 가 전달되었다. 이것을 캐치하기 위해 각각 String, String[] 자료형으로 getAttribute() 함수를 통해 값을 불러 담는다.

out.print(nick + "<br>");
out.print(Arrays.toString(hobbies) + "<br>");

방금 가져온 닉네임과 취미를 표시해본다.

session.removeAttribute("nickname");
nick = (String)session.getAttribute("nickname");

세션 이름을 정해서 특정 세션의 데이터를 삭제할 수 있다.

session.invalidate();

invalidate() 함수를 쓰면 모든 세션 데이터가 삭제된다. 이렇게 하는 경우 이 코드 이후로 세션을 사용하려 하면 문제가 발생하므로 더 이상 세션을 사용하고자 하지 않을 때 이 코드를 써야만 한다.

실습 2. 세션을 통한 로그인 만들기

session_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>
<% if (session.getAttribute("user_nick") != null) {%>
	<p>이미 로그인 중입니다.</p>
	<a href="session_welcome.jsp">웰컴 페이지로 이동</a>
<% } else { %>
	<form action="session_login_con.jsp" method="post">
		<input type="text" name="id" size="10" placeholder="ID"> <br>
		<input type="password" name="pw" size="10" placeholder="PW"> <br>
		<input type="text" name="nick" size="10" placeholder="NICK"> <br>
		<input type="submit" value="로그인">
	</form>
<% } %>
	
</body>
</html>

로그인 페이지에서는 form으로 ID, PW, 닉네임을 받아 POST 방식으로 전송한다. 그리고 혹여 세션이 이미 만들어져 있는 경우 getAttribute() 메서드를 통해 "user_nick" 과 일치하는 세션이 발견되면 이미 로그인 중이라는 메시지와 함께 링크를 제시하고, 폼은 표시하지 않는다.

session_login_con.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	request.setCharacterEncoding("utf-8");

	String id = request.getParameter("id");
	String pw = request.getParameter("pw");
	String nick = request.getParameter("nick");

	if (id.equals("abc1234") && pw.equals("aaa1111")) {
		session.setAttribute("user_id", id);
		session.setAttribute("user_nick", nick);
		response.sendRedirect("session_welcome.jsp");
	} else {
%> 
<%-- 
	HTML 내부에 자바스크립트 코드를 사용하려면 <script> 태그를 사용합니다.
	- JS 내장함수 alert()는 브라우저에 경고창을 띄운다.
	()안에 띄우고 싶은 문구를 작성하면 된다.
	- location.href="이동시킬 URL" == sendRedirect(URL)과 같은 기능
	- JS 내장객체 history가 제공하는 메서드인 back()은 뒤로가기 기능을 수행한다.
--%>
<script>
	alert("로그인에 실패했습니다.");
	//history.back();
	location.href="session_login.jsp";
</script>
<% } %>

세션 로그인 컨트롤러에서는 먼저 한글 표시를 하기 위해 setCharacterEncoding() 메서드에 utf-8 을 주고, id, pw, nick 변수를 각각 선언한 다음 request 객체의 getParameter() 메서드로 각 이름에 일치하는 세션의 Value 들을 가져온다.

이제 가져온 값을 토대로 id, pw가 일치하는 경우 user_id, user_nick 이라는 세션을 생성해 주고, response 객체로 웰컴 페이지로 리다이렉트 시킨다.

만약 둘 중 하나라도 일치하지 않는 경우엔 alert로 경고문을 출력하고 세션 로그인 페이지로 돌려보낸다.

session_welcome.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	/*
	1. 로그인하지 않은 사용자가 주소창에 이 페이지의 URL를 직접 적고
	들어왔을 경우 로그인창으로 돌려보내는 코드를 작성하세요.
	(조건문을 사용하여 로그인 성공 시 생성되는 세션이 있는지를 확인.)
	
	2. 로그인한 회원 아이디와 별명을 통해 "nick(id)님 환영합니다!" 를
	 출력하세요.
	 
	3. a태그로 로그인창으로 돌아가는 링크와 request폴더에 앨범 선택 페이지로
	 갈 수 있는 링크 2개를 작성하세요.
	 
	4. session_login.jsp에서도 로그인 세션이 존재하는지를 확인하여 이미 로그인 중인 사용자와
	 그렇지 않은 사용자가 서로 다른 화면을 볼 수 있도록 작성해 주세요.
	 (로그인 성공 -> 이미 로그인 중이라는 화면, 로그인 x -> 폼)
	*/ 
	
	if (session.getAttribute("user_id") == null) {
		response.sendRedirect("session_login.jsp");
	} else {
		String id = (String)session.getAttribute("user_id");
		String nick = (String)session.getAttribute("user_nick");

%>

<%@include file="../Application/app_basic.jsp" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h2><%=nick %>(<%=id%>)님 환영합니다!</h2>

	<a href="./session_login.jsp">로그인 화면으로 돌아가기</a>
	<a href="../JspObjRequest/req_album.jsp">앨범 선택 화면으로 이동</a>
	
	<hr>
	
	<h3>방문자 수: <%=count %></h3>
</body>
</html>

<% } %>

웰컴 페이지에서는 우선 세션이 생성되어 있는지 확인한다. 만약 없는 경우 로그인 페이지로 돌려보내고 (세션이 없거나, URL을 입력하여 웰컴 페이지로 이동하는 경우를 방지) 있는 경우에는 id, nick 을 받아와 표시하고 정상적인 웰컴 페이지를 노출시킨다.

실습 3. 세션을 통한 회원가입 구현하기

register_form.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>
	<h2>회원 가입 양식</h2>
   
   <form action="register_controller.jsp" method="post">
      <p>
         <input type="text" name="account" placeholder="ID" required> <br>
         <input type="password" name="password" placeholder="PW"> <br>
         <input type="text" name="name" placeholder="이름"> <br>
         <input type="text" name="nickname" placeholder="별명"> <br>
         <input type="submit" value="회원가입">
      </p>
   </form>
</body>
</html>

회원 가입 form 페이지를 작성하고 각 요소를 입력받아 register_controller 로 전달한다.

register_controller.jsp

<%@page import="user.UserRepository"%>
<%@page import="user.User"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	request.setCharacterEncoding("utf-8");

	String id = request.getParameter("account");
	String pw = request.getParameter("password");
	String name = request.getParameter("name");
	String nick = request.getParameter("nickname");
	
	// setter 4번 부르지 않아도 생성자 한번으로 해결
	User user = new User(id, pw, name, nick);
	
	UserRepository.save(user);
	UserRepository.showUsers();
	
	response.sendRedirect("register_result.jsp");
%>

컨트롤러측에서는 세션의 각 파라미터를 얻어오고 User 클래스에 접근하여 생성자를 통해 새 user 를 만든다.

그리고 방금 생성한 user 객체는 UserRepository 클래스의 메서드를 이용해 유저를 저장하고 보여준다.

User.java

package user;

public class User {
	private String account;
	private String password;
	private String name;
	private String nickName;
	
	public User() {}
	
	// 생성자 빠르게 만들기 alt + shift + s -> generate constructor using fields
	public User(String account, String password, String name, String nickName) {
		super();
		this.account = account;
		this.password = password;
		this.name = name;
		this.nickName = nickName;
	}
	
	public String getAccount() {
		return account;
	}
	public void setAccount(String account) {
		this.account = account;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getNickName() {
		return nickName;
	}
	public void setNickName(String nickName) {
		this.nickName = nickName;
	}
	
	// alt + shift + s -> generate getters and setters
}

UserRepository.java

package user;

import java.util.ArrayList;
import java.util.List;

public class UserRepository {
	// 회원의 정보를 담아놓을 리스트 (DB 대용)
	private static List<User> userList = new ArrayList<>();
	
	// 생성된 User 객체를 리스트에 추가하는 메서드
	public static void save(User user) {
		userList.add(user);
	}
	
	//회원 정보 저장 후 리스트 내부를 보여주는 메서드.
	   public static void showUsers() {
	      System.out.println("### 회원 정보 ###");

	      for(User user : userList) {
	         System.out.println("아이디: " + user.getAccount());
	         System.out.println("비밀번호: " + user.getPassword());
	         System.out.println("이름: " + user.getName());
	         System.out.println("별명: " + user.getNickName());
	         System.out.println("===============================");
	      }
	   }
	   
	   public static User getUser(String id) {
			for (User u : userList) {
				if (u.getAccount().equals(id))
					return u;
			}
			return null;
		}
	   
	   // 매개값으로 id를 받아, 해당 id를 가진 객체를 userList에서 삭제하는 메서드
	   public static void deleteUser(String id) {
		   // userList 직접 순환하지 않고 이런 식으로 해결 가능.
		   userList.remove(getUser(id));
	   }
}

유저 레포지토리를 생성하지 않아도 클래스 이름으로 바로 접근할 수 있게 모든 메서드는 static 으로 선언하였다.

유저 등록이 성공적으로 완료되었다면, register_result.jsp 로 이동된다.

register_result.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>
	<h2>회원 가입 성공!</h2>
	
	<a href="login_form.jsp">로그인 페이지로</a>
	<a href="register_form.jsp">회원가입 페이지로</a>
</body>
</html>

등록이 완료되었으면, login_form.jsp 로 이동할 수 있는 링크를 제공한다.

login_form.jsp

<%@page import="user.User"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	User user = (User)session.getAttribute("login");    
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%if (user == null) { %>
		<form action="login_controller.jsp" method="post">
         <input type="text" name="account" placeholder="아이디"> <br>
         <input type="password" name="password" placeholder="비밀번호"> <br>
         <input type="submit" value="로그인">
         <button type="button" onclick="location.href='register_form.jsp'">회원가입</button>
         <%--
            	onclick 속성을 사용하면 해당 태그가 클릭 되었을 시에 동작할
            	자바스크립트 문법을 작성할 수 있습니다.
            	자바스크립트는 문자열을 "", '' 둘 다 인정합니다.
          --%>
    	</form>
	<% } else { %>
		<h2><%=user.getName()%>님이 현재 로그인 중입니다.</h2>
		<a href="login_welcome.jsp">웰컴 페이지로</a>
	<% } %>

</body>
</html>

user 형의 데이터가 있는지 세션으로부터 "login" 이라는 이름의 Attribute를 찾아서 user형으로 다운캐스팅하여 넣는다.

그리고 유저 로그인 데이터가 존재하는 경우 로그인 페이지를 보여 줄 필요가 없지만, 없는 경우 로그인 폼을 노출시킨다.

login_controller.jsp

<%@page import="user.User"%>
<%@page import="user.UserRepository"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	/*
	1. 입력된 회원 정보를 가져오세요.
	
	2. 로그인을 시도하는 회원의 모든 정보를 얻어오세요. (getUser())
	getUser() -> 아이디를 전달받아 해당 아이디와 일치하는 객체가 있는지
	확인 후, 있다면 그 객체를 리턴.
	일치하는 객체가 없다면 null을 리턴.
	
	3. 조건문을 사용하여 getUser()의 리턴값이 null인지 아닌지를 확인하여
	 null값을 받았다면 회원가입이 되어있지 않은 사람이 로그인을 시도한 것이므로
	  로그인 페이지로 보내주세요. (script로 경고창 띄운 후 로그인 페이지로. (location.href=""))
	  
	4. getUser()의 리턴값이 null이 아닌 경우
	회원 가입 당시에 작성했던 비밀번호가 로그인할 때 작성한 비밀번호와
	일치하는지를 확인하여 같다면 세션에 로그인 데이터를 저장해 주세요.
	("login", User객체)
	
	5. 세션을 만든 후 "login_welcome.jsp"로 페이지를 이동시켜 주세요.
	
	6. 비밀번호가 일치하지 않는다면 script태그로 "비밀번호가 일치하지 않습니다."
	 경고창 하나 띄워 주시고 다시 로그인 페이지로 이동시켜 주세요.
	*/
	String id = request.getParameter("account");
	String pw = request.getParameter("password");
	
	User user = UserRepository.getUser(id);
	
	if (user == null) { %>
		<script>
			alert("회원가입이 되어 있지 않습니다.")
			location.href="login_form.jsp";
		</script>
	<% } else if (user.getPassword().equals(pw)) {
		// 비밀번호까지 일치한 경우 유저 객체 저장
		session.setAttribute("login", user);
		response.sendRedirect("login_welcome.jsp");
	} else { %>
		<script>
			alert("비밀번호가 일치하지 않습니다.");
			location.href="login_form.jsp";
		</script>
	<% }
%>

로그인 컨트롤러에서는 id, pw를 얻어 온 다음, 만약 id에 해당하는 유저가 list에 존재하지 않는 경우 경고메시지를 보여주고 로그인 폼으로 돌려보낸다.

id가 존재하고 pw까지 일치한다면, 유저 객체를 세션에 저장하고 웰컴 페이지로 리다이렉트시킨다.

만약 id는 맞지만 pw가 다른 경우에는 비밀번호가 틀렸다는 경고를 보여준다.

다음 차시에는 login_welcome.jsp 구현과 회원 탈퇴, 로그아웃 기능을 구현하도록 한다.

0개의 댓글