로그인 : HttpSession, Cookie 사용

null·2022년 10월 2일
0

JAVA_Bitcamp

목록 보기
1/10

1단계 - 로그인 폼 작성

  • /webapp/auth/form.jsp 생성
<%@ page language="java" 
    contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>bitcamp</title>
</head>
<body>
<h1>로그인</h1>

<form action='login'>
<table border='1'>
  <tr>
    <th>이메일</th><td><input name='email' type='email' size='30'></td>
  </tr>
  <tr>
    <th>암호</th><td><input name='password' type='password' size='20'></td>
  </tr>
</table>
  <button type='submit'>로그인</button>
  <a href='../'>취소</a>
</p>
</form>

</body>
</html>

2단계 - 로그인 처리

  • LoginController 클래스 생성
    • 로그인 사용자 정보를 HttpSession 보관소에 저장
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.bitcamp.board.dao.MemberDao;
import com.bitcamp.board.domain.Member;

@WebServlet("/auth/login")
public class LoginController extends HttpServlet {
  private static final long serialVersionUID = 1L;

  MemberDao memberDao;

  @Override
  public void init() {
    memberDao = (MemberDao) this.getServletContext().getAttribute("memberDao");
  }

  @Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    try {
      String email = request.getParameter("email");
      String password = request.getParameter("password");

      Member member = memberDao.findByEmailPassword(email, password);

      if (member != null) {
        HttpSession session = request.getSession(); // 요청한 클라이언트의 전용 HttpSession 보관소를 얻는다.
        session.setAttribute("loginMember", member); // 로그인한 멤버 정보를 세션 보관소에 저장
      }
      request.setAttribute("member", member);

      response.setContentType("text/html;charset=UTF-8");
      request.getRequestDispatcher("/auth/loginResult.jsp").include(request, response);

    } catch (Exception e) {
      request.setAttribute("exception", e);
      request.getRequestDispatcher("/error.jsp").forward(request, response); 
    }
  }
}
  • /webapp/auth/loginResult.jsp 파일 생성
    • 로그인 결과에 따라 Refresh경로를 지정
  <%@ page language="java" 
    contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>bitcamp</title>
<meta http-equiv='Refresh' content='1; url=${empty member ? "form.jsp" : "../"}'>
</head>
<body>
<h1>로그인</h1>
<c:choose>
  <c:when test="${not empty member}">
    <p>로그인 성공입니다!</p>
  </c:when>
  <c:otherwise>
    <p>회원이 존재하지 않습니다!</p>
  </c:otherwise>
</c:choose>
</body>
</html>

3단계 - 로그인할 때 입력한 사용자 이메일 저장

  • LoginController 클래스 변경
    • 로그인 이메일을 쿠키로 웹브라우저에게 보내기
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.bitcamp.board.dao.MemberDao;
import com.bitcamp.board.domain.Member;

@WebServlet("/auth/login")
public class LoginController extends HttpServlet {
  private static final long serialVersionUID = 1L;

  MemberDao memberDao;

  @Override
  public void init() {
    memberDao = (MemberDao) this.getServletContext().getAttribute("memberDao");
  }

  @Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    try {
      String email = request.getParameter("email");
      String password = request.getParameter("password");

      Member member = memberDao.findByEmailPassword(email, password);

      if (member != null) {
        HttpSession session = request.getSession(); // 요청한 클라이언트의 전용 HttpSession 보관소를 얻는다.
        session.setAttribute("loginMember", member); // 로그인한 멤버 정보를 세션 보관소에 저장
      }

      // 클라이언트에게 쿠키 보내기
      // - 쿠키 데이터는 문자열만 가능
      Cookie cookie = new Cookie("email", email); // 클라이언트 쪽에 저장할 쿠키 생성
      if (request.getParameter("saveEmail") == null) {
        cookie.setMaxAge(0); // 클라이언트에게 해당 이름의 쿠키를 지우라고 명령한다.
      } else {
        // 쿠키의 지속시간을 설정하지 않으면 웹브라우저가 실행되는 동안만 유효하다.
        // 만약 웹브라우저를 종료하더라도 쿠키를 유지하고 싶다면,
        // 지속 시간을 설정: cookie.setMaxAge();
        cookie.setMaxAge(60 * 60 * 24 * 7); // 7일
      }
      response.addCookie(cookie); // 응답 헤더에 쿠키를 포함시킨다.

      request.setAttribute("member", member);

      response.setContentType("text/html;charset=UTF-8");
      request.getRequestDispatcher("/auth/loginResult.jsp").include(request, response);

    } catch (Exception e) {
      request.setAttribute("exception", e);
      request.getRequestDispatcher("/error.jsp").forward(request, response); 
    }
  }
}
  • /webapp/auth/form.jsp 변경
    • 쿠키 테이블에 보관된 이메일 정보를 꺼내 이메일 입력란에 출력
  <%@ page language="java" 
    contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>bitcamp</title>
</head>
<body>
<h1>로그인</h1>

<form action='login'>
<table border='1'>
  <tr>
    <th>이메일</th><td><input name='email' type='email' size='30' value="${cookie.email.value}"></td>
  </tr>
  <tr>
    <th>암호</th><td><input name='password' type='password' size='20'></td>
  </tr>
</table>
<input type="checkbox" name="saveEmail">이메일 저장<br>
<p>
  <button type='submit'>로그인</button>
  <a href='../'>취소</a>
</p>
</form>

</body>
</html>

0개의 댓글