로그인, 로그아웃 with HttpSession
- HttpSession 객체
- void setAttribute(String name, Object value);
- Object getAttribute(String name);
- 위 두 메소드를 활용해서 값을 저장 및 조회할 수 있다.
login.jsp
<%@page import="org.apache.commons.codec.digest.DigestUtils"%>
<%@page import="com.sample.board.vo.User"%>
<%@page import="com.sample.board.dao.UserDao"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
// loginform.jsp에서 제출한 입력값을 조회한다
String id = request.getParameter("id");
String password = request.getParameter("password");
// 사용자 인증에 필요한 사용자 정보를 조회하기 위해 UserDao 객체를 획득하고,
UserDao userDao = UserDao.getInstance();
// 아이디로 사용자 정보를 조회한다.
User user = userDao.getUserById(id);
if (user == null) { // id에 해당하는 회원정보가 존재하지 않을 때
response.sendRedirect("loginform.jsp?fail=id");
return;
}
// 비밀번호 비교를 위해서 로그인폼에서 제출한 비밀번호를 암호화한다.
String secretPassword = DigestUtils.sha256Hex(password);
if (!user.getPassword().equals(secretPassword)) { // 비밀번호가 일치하지 않을 때
response.sendRedirect("loginform.jsp?fail=pwd");
return;
}
...
// 회원정보가 존재하고, 비밀번호가 일치할 때
// 사용자 인증이 완료되면 사용자 정보를 로그인을 요청한 클라이언트의 전용 HttpSession 객체에 속성으로 저장시킨다.
session.setAttribute("LOGIN_USER_INFO", user);
response.sendRedirect("index.jsp");
%>
index.jsp
<%@page import="com.sample.board.vo.User"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!doctype html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" >
<title>커뮤니티 게시판</title>
</head>
<body>
<%
pageContext.setAttribute("menu", "home");
%>
<%@include file="common/navbar.jsp"%>
<div class="container">
<div class="row mb-3">
<div class="col">
<div class="p-5 mb-4 bg-light rounded-3">
<div class="container-fluid py-5">
<h1 class="disply-5 fw-bold">커뮤니티 게시판</h1>
<p class="fs-4">커뮤니티에서 글을 게시하고, 공유해보세요</p>
<%
// getAttribute 객체는 항상 Object를 반환하기 때문에 형변환이 필요하다
User user = (User)session.getAttribute("LOGIN_USER_INFO");
if (user == null) {
%>
<div>
<a href="loginform.jsp" class="btn btn-primary btn-lg">로그인</a>
<a href="registerform.jsp" class="btn btn-primary btn-lg">회원가입</a>
</div>
<%
} else {
%>
<div class="mt-3">
<p class="fs-4"><strong class="text-primary"><%=user.getName() %>님</strong> 환영합니다</p>
<p class="fs-4">다양한 게시글을 확인해 보세요!</p>
</div>
<%
}
%>
</div>
</div>
</div>
</div>
logout.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
// 로그아웃은 인증된 사용자정보가 저장된 HttpSession객체를 폐기하는 것이다.
// HttpSession객체의 invalidate() 메소드는 HttpSession객체를 폐기한다.
// session.invalidate()를 실행하면 사용자정보(User객체)가 저장된 HttSession 객체가 폐기된다.
// 즉, 서버에 로그아웃을 요청한 클라이언트 전용의 HttpSession객체가 사라진 것이다.
session.invalidate();
// 클라이언트에 index.jsp를 재요청하게 하는 응답을 보낸다.
// 이 응답을 받은 클라이언트가 index.jsp를 재요청하면 웹서버는 HttpSession객체를 새로 생성한다.
// 새로 생성한 HttpSession객체에는 인증된 사용자 정보가 존재하지 않는다.
response.sendRedirect("index.jsp");
%>