3. HttpSession의 활용 - 로그인 정보 사용
LogInServlet 클래스에서 HttpSession 보관소에 저장한 Member 객체를 Header.jsp에서 꺼내 본다. 로그인 정보 사용 시나리오는 다음과 같다(그림 1).
① 로그인 성공일 때, 서버로부터 리다이렉트 응답을 받는다. 즉시 웹 브라우저는 톰캣 서버에 리다이렉트 URL(/member/list)을 요청한다.
② MemberListServlet 클래스는 데이터베이스에서 회원 목록을 가져온 후, MemberList.jsp에게 화면 출력 작업을 위임한다.
③ MemberList.jsp는 화면 상단의 내용을 출력하기 위해 Header.jsp를 인클루딩 한다.
④ Header.jsp는 HttpSession 객체에 보관된 로그인 회원의 정보(Member 객체)를 꺼낸다.
⑤ 또한 Header.jsp는 Member 객체로부터 이름을 추출하여 로그인 사용자 정보를 출력한다.
⑥ MemberList.jsp는 화면 하단의 내용을 출력하기 위해 Tail.jsp를 인클루딩 한다.
⑦ MemberListServlet 클래스는 MemberList.jsp가 작업한 내용을 최종적으로 출력함으로써 응답을 완료한다.
- 페이지 헤더에 로그인 사용자 이름 출력
web05 프로젝트의 webapp 폴더의 Header.jsp를 편집한다.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="spms.vo.Member"%>
<%
//세션 객체를 가져와 member 객체로 넣음
Member member = (Member)session.getAttribute("member");
%>
<div style="background-color:#00008b; color:#ffffff; height:20px; padding:5px;">
SPMS(Simple Project Management System)
<span style="float:right;">
<%=member.getName()%>
<a style="color:white;" href="<%=request.getContextPath()%>/auth/logout">로그아웃</a>
</span>
</div>
JSP 내장 객체 session을 사용하여 "member"라는 키로 저장된 값을 꺼낸다.
<%
//세션 객체를 가져와 member 객체로 넣음
Member member = (Member)session.getAttribute("member");
%>
HttpSession 보관소에서 꺼낸 Member 객체로부터 이름을 알아내어 사용자 로그인 정보를 출력한다.
<span style="float:right;">
<%=member.getName()%>
<a style="color:white;" href="<%=request.getContextPath()%>/auth/logout">로그아웃</a>
</span>
로그인 사용자의 이름과 '로그아웃' 링크를 출력한다.
이제 로그인 최종 테스트를 실행한다. JSP 페이지를 변경할 경우 톰캣 서버를 재시작할 필요가 없다. 물론 서블릿을 변경할 경우에도 '자동 로딩'이 설정되어 있다면, 최대 5초 정도 기다리면 변경된 서블릿이 다시 로딩된다. 하지만, 정확한 테스트를 위해 서블릿을 변경할 경우에는 톰캣 서버를 재시작하고 나서 테스트를 하는게 바람직하다. JSP는 저장한 후 바로 테스트 하면 된다.
다시 로그인 페이지를 테스트한다. 정상적으로 로그인 되면 화면 상단에 로그인 한 사용자의 이름과 로그아웃 링크가 출력될 것이다(그림 2).
이렇게 HttpSession 객체에 보관된 값은 로그아웃 하여 세션을 무효화시킬 때까지 유지된다.
4. HttpSession의 활용 - 로그아웃
HttpSession 객체에 보관된 모든 값들을 없애고 싶다면, 세션을 무효화시키면 된다. 로그아웃 수행 시나리오는 다음과 같다(그림 3).
① 회원 목록 화면에서 상단에 있는 '로그아웃' 링크를 클릭하면, 웹 브라우저는 LogOutServlet 클래스를 요청한다.
② LogOutServlet 클래스는 HttpSession 객체를 없애기 위해 invalidate() 메서드를 호출한다. HttpSession 객체는 제거된다.
③ 그리고 로그인 입력폼으로 리다이렉트 한다. 다시 로그인 입력폼을 출력할 때 HttpSession 객체는 새로 생성된다.
④ 새로 생성된 HttpSession을 가지고 회원 목록 서블릿을 실행한다. MemberListServlet 클래스는 데이터베이스에서 회원 목록 정보를 가져온다.
⑤ 그리고 MemberListServlet 클래스는 MemberList.jsp에 화면 출력을 위임한다.
⑥ MemberList.jsp는 화면 상단의 내용을 출력하기 위해 Header.jsp를 인클루딩 한다.
⑦ Header.jsp는 HttpSession 보관소에서 'member'라는 이름으로 저장된 객체를 꺼낸다. 하지만, 로그아웃 하면서 기존의 HttpSession 객체가 제거되고, HttpSession 객체가 새로 만들어졌기 때문에 이 세션 객체에는 어떠한 값도 들어 있지 않다. 따라서 HttpSession 객체는 null을 반환한다. 당연히 null에 대해 회원 이름을 꺼내려 하므로 오류가 발생할 것이다.
- 로그아웃 서블릿 생성
spms.servlets 패키지에 LogOutServlet 클래스를 생성한다.
package spms.servlets;
import java.io.IOException;
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("/auth/logout")
public class LogOutServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
//세션 객체 무효화(객체 제거)
session.invalidate();
response.sendRedirect("login");
}
}
HttpSession 객체를 무효화하기 위해 invalidate() 메서드를 호출한다. 세션 객체가 무효화 된다는 것은 HttpSession 객체가 제거된다는 것을 의미한다.
//세션 객체 무효화(객체 제거)
session.invalidate();
HttpSession 객체를 무효화시킨 후, 새로운 요청이 들어오면 HttpSession 객체가 새로 만들어진다.
톰캣을 재시작하고 나서 다시 로그인 한다. 회원 목록 화면에서 '로그아웃' 링크를 누른다. 그러면 로그인 입력폼을 다시 출력할 것이다. 이 상태에서 http://localhost:9999/web05/member/list를 통해 회원 목록 페이지를 요청한다. 앞의 시나리오에서 언급한 대로 새로 만들어진 HttpSession 객체에는 'member' 키로 저장된 값이 없기 때문에(로그인 성공 상태가 아니기 때문) 오류 페이지가 출력될 것이다(그림 4).
톰캣 서버의 콘솔창을 확인해보면 더더욱 오류 내용을 확인할 수 있다(그림 5).
참고도서 : https://freelec.co.kr/book/1674/
[열혈강의] 자바 웹 개발 워크북
[열혈강의] 자바 웹 개발 워크북
freelec.co.kr
'교재 실습 > 자바 웹 개발 워크북' 카테고리의 다른 글
50. JSP 액션 태그의 사용 (1) (0) | 2022.06.21 |
---|---|
49. 데이터 보관소 (5) (0) | 2022.06.20 |
47. 데이터 보관소 (3) (0) | 2022.06.18 |
46. 데이터 보관소 (2) (0) | 2022.06.16 |
45. 데이터 보관소 (1) (0) | 2022.06.15 |
댓글