Jsp-06.session

이현주·2023년 10월 2일
0

JSP

목록 보기
6/11

1. 세션으로 로그인정보를 저장.

브라우저를 닫거나, 일정 시간이 만료되면 세션에 저장된 정보가 사라진다.

[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. 최초1회 List형식의 cart 객체를 생성한 후 세션에 카트 속성을 저장한다.

  2. 이후 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);
  }

}


profile
졸려요

0개의 댓글