브라우저를 닫거나, 일정 시간이 만료되면 세션에 저장된 정보가 사라진다.
[main.jsp]
세션 아이디가 비어있다면 로그인이 안된상태.
-> 로그인 폼을 보여준다.
세션 아이디에 값이 있다면 로그인이 된상태
-> 로그아웃 버튼과 쇼핑목록 폼을 보여준다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:set var="contextPath" value="${pageContext.request.contextPath}" />
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://code.jquery.com/jquery-3.7.1.min.js" integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo=" crossorigin="anonymous"></script>
<script>
// $(function(){})로 처리하면, <body> 태그를 모두 읽은 뒤 function(){}을 실행한다.
$(function(){
$('#btn_logout').click(function(){
location.href = '${contextPath}/logout';
})
})
</script>
</head>
<body>
<%-- 로그인 안 된 상태 --%>
<c:if test="${sessionScope.id == null}">
<div>
<form method="post" action="${contextPath}/login">
<div>
<label for="id">아이디</label>
<input type="text" name="id" id="id">
</div>
<div>
<label for="pw">비밀번호</label>
<input type="password" name="pw" id="pw">
</div>
<div>
<button type="submit">로그인</button>
</div>
</form>
</div>
</c:if>
<%-- 로그인 된 상태 --%>
<c:if test="${sessionScope.id != null}">
<div>${sessionScope.id}님 환영합니다.</div>
<div><button type="button" id="btn_logout">로그아웃</button></div>
</c:if>
<hr>
<div>
<form method="get" action="${contextPath}/addToCart">
<h4>쇼핑목록</h4>
<div>
<select name="item">
<option>진라면</option>
<option>신라면</option>
<option>삼양라면</option>
</select>
<input type="text" name="ea" placeholder="구매개수">
</div>
<div>
<button type="submit">장바구니추가</button>
</div>
</form>
</div>
</body>
</html>

아이디와 패스워드가 같다면,
세션에 아이디를 저장해 두고
session.setAttribute("id", id);
일정시간동안 세션을 유지한다.
session.setMaxInactiveInterval(60 * 10); // 10분간 세션 유지
[Login.java]
package ex06_session;
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;
/**
* Servlet implementation class Login
*/
@WebServlet("/login")
public class Login extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public Login() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 요청 인코딩
request.setCharacterEncoding("UTF-8");
// 요청 파라미터
String id = request.getParameter("id");
String pw = request.getParameter("pw");
// 로그인 성공 규칙 : id와 pw가 동일하면 로그인 성공으로 가정하고 풀이
if(id.equals(pw)) {
// 로그인 처리 : session에 id를 저장해 두기
HttpSession session = request.getSession();
session.setAttribute("id", id);
session.setMaxInactiveInterval(60 * 10); // 10분간 세션 유지
}
// main 화면으로 되돌아가기
response.sendRedirect(request.getContextPath() + "/ex06_session/main.jsp");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}

session.invalidate()로 모든 세션정보를 초기화한다.
// 로그아웃 : session 초기화
HttpSession session = request.getSession();
session.invalidate();
[Logout.java]
package ex06_session;
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;
/**
* Servlet implementation class Logout
*/
@WebServlet("/logout")
public class Logout extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public Logout() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 로그아웃 : session 초기화
HttpSession session = request.getSession();
session.invalidate();
// main 화면으로 되돌아가기
response.sendRedirect(request.getContextPath() + "/ex06_session/main.jsp");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}

세션에 저장된 cart 정보를 화면에 출력한다.
[cart.jsp]
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:set var="contextPath" value="${pageContext.request.contextPath}" />
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://code.jquery.com/jquery-3.7.1.min.js" integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo=" crossorigin="anonymous"></script>
<script>
// $(function(){})로 처리하면, <body> 태그를 모두 읽은 뒤 function(){}을 실행한다.
$(function(){
$('#btn_shop').click(function(){
location.href = '${contextPath}/ex06_session/main.jsp';
})
$('#btn_clear_cart').click(function(){
if(confirm('장바구니를 비울까요?')){
location.href = '${contextPath}/clearCart';
} else {
alert('장바구니 비우기를 취소했습니다.');
}
})
})
</script>
</head>
<body>
<c:if test="${empty sessionScope.cart}">
<div>장바구니가 비었습니다</div>
</c:if>
<c:if test="${not empty sessionScope.cart}">
<c:forEach var="elem" items="${sessionScope.cart}">
<div>${elem.item} ${elem.ea}</div>
</c:forEach>
</c:if>
<div>
<button type="button" id="btn_shop">계속쇼핑하기</button>
<button type="button" id="btn_clear_cart">장바구니비우기</button>
</div>
</body>
</html>
최초1회 List형식의 cart 객체를 생성한 후 세션에 카트 속성을 저장한다.
이후 AddToCart() 가 실행될 때마다 cart리스트객체에 map을 추가한다.
[AddToCart.java]
package ex06_session;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
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;
/**
* Servlet implementation class AddToCart
*/
@WebServlet("/addToCart")
public class AddToCart extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public AddToCart() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 요청 인코딩
request.setCharacterEncoding("UTF-8");
// 요청 파라미터
String item = request.getParameter("item");
int ea = Integer.parseInt(request.getParameter("ea"));
// item + ea -> Map
Map<String, Object> map = new HashMap<String, Object>();
map.put("item", item);
map.put("ea", ea);
// 장바구니 처리 방법 : session에 cart 속성을 저장하고 cart에 [item + ea -> Map] 저장하기
HttpSession session = request.getSession();
List<Map<String, Object>> cart = (List<Map<String, Object>>)session.getAttribute("cart");
if(cart == null) {
cart = new ArrayList<Map<String,Object>>();
session.setAttribute("cart", cart);
}
// cart에 Map 저장하기
cart.add(map);
// 응답 타입과 인코딩
response.setContentType("text/html; charset=UTF-8");
// 응답 출력 스트림
PrintWriter out = response.getWriter();
// 응답하기
out.println("<script>");
out.println("if(confirm('" + item + "을 장바구니에 담았습니다. 장바구니로 가려면 \"확인\" 계속 쇼핑하려면 \"취소\" 버튼을 누르세요')){");
out.println("location.href='" + request.getContextPath() + "/ex06_session/cart.jsp'");
out.println("}else{");
out.println("location.href='" + request.getContextPath() + "/ex06_session/main.jsp'");
out.println("}");
out.println("</script>");
out.flush();
out.close();
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}

장바구니 비우기 : session에 저장된 cart 지우기
HttpSession session = request.getSession();
session.removeAttribute("cart");
[ClearCart.java]
package ex06_session;
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;
/**
* Servlet implementation class ClearCart
*/
@WebServlet("/clearCart")
public class ClearCart extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public ClearCart() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 장바구니 비우기 : session에 저장된 cart 지우기
HttpSession session = request.getSession();
session.removeAttribute("cart");
// main 화면으로 되돌아가기
response.sendRedirect(request.getContextPath() + "/ex06_session/main.jsp");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}

