본문 바로가기
☕ Java 웹 프로그래밍/Servlet & JSP

[Servlet&JSP] 쿠키 삭제하기

by 일단연 2023. 6. 3.

* 본 글은 [뉴렉처]의 Servlet&JSP 프로그래밍 강의를 듣고 정리한 글입니다.

 

2020 Servlet&JSP 프로그래밍

 

www.youtube.com

 

 쿠키 삭제하기 

계산기에서 C 버튼을 누르면 누적된 값들이 삭제되도록 코드 수정

  • 누적된 값들을 삭제하는 것은 사실 쿠키를 삭제하는 것

 

  • 1) [Calc3.java] 사용자가 입력한 값에 따라 로직을 다르게 구현하는 블럭에, C에 대한 로직(쿠키 삭제)을 추가
    • C에 대한 로직: 누적된 값을 삭제(쿠키 삭제)
    • 연산식 자체를 비워버리면 됨 > 연산을 빈 문자열로 만듦
    • exp = “”;
//사용자가 입력한 값이 =이라면 누적된 값을 계산
if(operator != null && operator.equals("=")) {
  ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
  try {
    exp = String.valueOf(engine.eval(exp));
  } catch (ScriptException e) {
    e.printStackTrace();
  }
}
//사용자가 입력한 값이 C라면 누적된 값 삭제(쿠키 삭제)
else if(operator != null && operator.equals("C")) {
  exp = "";
}
//사용자가 입력한 값이 value, operator, dot이라면 누적
else {
  exp += (value == null) ? "" : value;
  exp += (operator == null) ? "" : operator;
  exp += (dot == null) ? "" : dot
}
  • 결과: 쿠키가 정상적으로 삭제되지 않음
    • 연산식을 만들어 C 버튼 클릭

  • 정상적으로 작동되었다면 입력창에 0이 떠야 하지만, 아무것도 안 뜸
    • [CalcPage.java] 누적된 값이 없다면 입력창에 0을 띄우는 코드가 있음
      • String exp = “0”;

  • 개발자 도구>Response Headers 확인
    • 전달된 쿠키가 없어야 하는데, 서버에서 클라이언트로 ‘exp= ‘라는 쿠키가 전달됨

 

  • [Calc3.java] 쿠키 객체를 생성할 때 만료날짜를 0으로 설정
    • 만료날짜가 0이라는 의미: 브라우저를 끄지 않아도 쿠키가 소멸될 수 있음
      • 만료날짜를 따로 설정하지 않으면 브라우저를 꺼야 쿠키가 삭제됨
    • 사용자가 입력한 값이 C일 때만 연산식 쿠키의 만료날짜를 0으로 설정
      • C 버튼을 누르면 누적된 값들이 브라우저로 가서 바로 소멸됨 (쿠키가 남지 않고 삭제됨)
      • if(operator != null && operator.equals("C")) {
           expCookie.setMaxAge(0);
        }
//쿠키에에서 값을 읽어와 사용자가 입력한 값에 덧붙인 값을 쿠키로 저장
Cookie expCookie = new Cookie("exp", exp);
// 브라우저를 끄지 않아도 C 버튼을 누르면 쿠키가 삭제됨
if(operator != null && operator.equals("C")) {
  expCookie.setMaxAge(0);
}
//서버에서 클라이언트로 exp의 쿠키 보내기
response.addCookie(expCookie);
//계산기에서 버튼을 클릭하면 빈 화면이 출력되지 않고 CalcPage.java의 화면이 출력됨
response.sendRedirect("calcpage");

 

계산기에서 C 버튼을 누르면 누적된 값들이 삭제되도록 코드를 수정한 결과

  • 연산식을 만들어 C 버튼 클릭

  • 정상적으로 0이 출력됨 (쿠키가 삭제됨)

  • 개발자 도구>Response Headers 확인
    • 전달된 쿠키가 없음

 

 

완성된 코드

  • Calc3.java
package com.newlecture.web;

import java.io.IOException;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
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;

@WebServlet("/calc3")
public class Calc3 extends HttpServlet {
  @Override
  protected void service(HttpServletRequest request
                        , HttpServletResponse response)
                        throws ServletException, IOException
  {
    Cookie[] cookies = request.getCookies();
		
    //사용자가 입력한 값들을 받는 문자열
    String value = request.getParameter("value");
    String operator = request.getParameter("operator");
    String dot = request.getParameter("dot");
		
    //쿠키에서 값을 읽어와 사용자가 입력한 값에 덧붙임
    String exp = "";
    if(cookies != null) {
      for(Cookie c : cookies) {
        if(c.getName().equals("exp")) {
          exp = c.getValue();
          break;
        }
      }
    }
		
    //사용자가 입력한 값이 =이라면 계산을 위한 로직 구현
    if(operator != null && operator.equals("=")) {
      ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
      try {
        exp = String.valueOf(engine.eval(exp));
      } catch (ScriptException e) {
        e.printStackTrace();
      }
    }
    
    //사용자가 입력한 값이 value, operator, dot이라면 누적
    else {
      exp += (value == null) ? "" : value;
      exp += (operator == null) ? "" : operator;
      exp += (dot == null) ? "" : dot;
    }
    //사용자가 입력한 값이 C라면 누적된 값 삭제(쿠키 삭제)
    else if(operator != null && operator.equals("C")) {
      exp = "";
    }
    //쿠키에에서 값을 읽어와 사용자가 입력한 값에 덧붙인 값을 쿠키로 저장
    Cookie expCookie = new Cookie("exp", exp);
    // 브라우저를 끄지 않아도 C 버튼을 누르면 쿠키가 삭제됨
    if(operator != null && operator.equals("C")) {
      expCookie.setMaxAge(0);
    }
    response.addCookie(expCookie);	
    response.sendRedirect("calcpage");
  }
}
  • CalcPage.java
package com.newlecture.web;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletContext;
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;

@WebServlet("/calcpage")
public class CalcPage extends HttpServlet {
  @Override
  protected void service(HttpServletRequest request
                        , HttpServletResponse response)
                        throws ServletException, IOException
  {
    Cookie[] cookies = request.getCookies();
		
    String exp = "0";
    if(cookies != null) {
      for(Cookie c : cookies) {
        if(c.getName().equals("exp")) {
          exp = c.getValue();
          break;
        }
      }
    }
		
    response.setContentType("text/html; charset=UTF-8");
    response.setCharacterEncoding("UTF-8");
    PrintWriter out = response.getWriter();

    out.write("<!DOCTYPE html>");
    out.write("<html>");
    out.write("  <head>");
    out.write("    <meta charset=\\"UTF-8\\">");
    out.write("    <title>계산기 웹 프로그램</title>");
    out.write("    <style>");
    out.write("      input{");
    out.write("        width: 50px;");
    out.write("        height: 50px;");
    out.write("      }");
    out.write("      .output{");
    out.write("        height: 50px;");
    out.write("        background: #e9e9e9;");
    out.write("        font-size: 24px;");
    out.write("        font-weight: bold;");
    out.write("        text-align: right;");
    out.write("        padding: 0px 5px;");
    out.write("      }");
    out.write("    </style>");
    out.write("  </head>");
    
    out.write("  <body>");
    out.write("    <form action=\\"calc3\\" method=\\"post\\">");
    out.write("      <table>");
    out.write("        <tr>");
    out.printf("          <td class = \\"output\\" colspan=\\"4\\">%s</td>", exp);
    out.write("        </tr>");
    out.write("        <tr>");
    out.write("          <td><input type=\\"submit\\" name=\\"operator\\" value=\\"CE\\"></td>");
    out.write("          <td><input type=\\"submit\\" name=\\"operator\\" value=\\"C\\"></td>");
    out.write("          <td><input type=\\"submit\\" name=\\"operator\\" value=\\"BS\\"></td>");
    out.write("          <td><input type=\\"submit\\" name=\\"operator\\" value=\\"÷\\"></td>");
    out.write("        </tr>");
    out.write("        <tr>");
    out.write("          <td><input type=\\"submit\\" name=\\"value\\" value=\\"7\\"></td>");
    out.write("          <td><input type=\\"submit\\" name=\\"value\\" value=\\"8\\"></td>");
    out.write("          <td><input type=\\"submit\\" name=\\"value\\" value=\\"9\\"></td>");
    out.write("          <td><input type=\\"submit\\" name=\\"operator\\" value=\\"x\\"></td>");
    out.write("        </tr>");
    out.write("        <tr>");
    out.write("          <td><input type=\\"submit\\" name=\\"value\\" value=\\"4\\"></td>");
    out.write("          <td><input type=\\"submit\\" name=\\"value\\" value=\\"5\\"></td>");
    out.write("          <td><input type=\\"submit\\" name=\\"value\\" value=\\"6\\"></td>");
    out.write("          <td><input type=\\"submit\\" name=\\"operator\\" value=\\"-\\"></td>");
    out.write("        </tr>");
    out.write("        <tr>");
    out.write("          <td><input type=\\"submit\\" name=\\"value\\" value=\\"1\\"></td>");
    out.write("          <td><input type=\\"submit\\" name=\\"value\\" value=\\"2\\"></td>");
    out.write("          <td><input type=\\"submit\\" name=\\"value\\" value=\\"3\\"></td>");
    out.write("          <td><input type=\\"submit\\" name=\\"operator\\" value=\\"+\\"></td>");
    out.write("        </tr>");
    out.write("        <tr>");
    out.write("          <td></td>");
    out.write("          <td><input type=\\"submit\\" name=\\"value\\" value=\\"0\\"></td>");
    out.write("          <td><input type=\\"submit\\" name=\\"dot\\" value=\\".\\"></td>");
    out.write("          <td><input type=\\"submit\\" name=\\"operator\\" value=\\"=\\"></td>");
    out.write("        </tr>");
    out.write("      </table>");
    out.write("    </form>");
    out.write("  </body>");
    out.write("</html>");
  }
}