쿠키는 클라이언트의 상태 정보를 유지하기 위한 기술.
상태 정보를 클라이언트에 key와 value 형태로 저장했다가 다음 요청 시 저장된 쿠키를 함께 전송하면 웹 서버는 클라이언트가 전송한 쿠키로부터 필요한 데이터를 읽어온다.
쿠키의 속성
쿠키 메서드
CookieMain.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<head><title>Cookie</title></head>
<body>
<h2>1. 쿠키(Cookie) 설정</h2>
<%
Cookie cookie = new Cookie("myCookie", "쿠키맛나요"); // 쿠키 생성
cookie.setPath(request.getContextPath()); // 경로를 컨텍스트 루트로 설정
cookie.setMaxAge(3600); // 유지 기간을 1시간으로 설정
response.addCookie(cookie); // 응답 헤더에 쿠키 추가
%>
<h2>2. 쿠키 설정 직후 쿠키값 확인하기</h2>
<%
Cookie[] cookies = request.getCookies(); // 요청 헤더의 모든 쿠키 얻기
if (cookies!=null) {
for (Cookie c : cookies) { // 쿠키 각각의
String cookieName = c.getName(); // 쿠키 이름 얻기
String cookieValue = c.getValue(); // 쿠키 값 얻기
// 화면에 출력
out.println(String.format("%s : %s<br/>", cookieName, cookieValue));
}
}
%>
<h2>3. 페이지 이동 후 쿠키값 확인하기</h2>
<a href="CookieResult.jsp">
다음 페이지에서 쿠키값 확인하기
</a>
</body>
</html>
CookieResult.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>CookieResult.jsp</title>
</head>
<body>
<h2>쿠키값 확인하기(쿠키가 생성된 이후의 페이지)</h2>
<%
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (int i = 0; i < cookies.length; i++) {
String cookieName = cookies[i].getName();
String cookieValue = cookies[i].getValue();
out.println(String.format("쿠키명 : %s - 쿠키값 : %s<br/>",
cookieName, cookieValue));
}
}
%>
</body>
</html>
PopupMain_0.1.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String popupMode = "on"; // 레이어 팝업창 띄울지 여부
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>쿠키를 이용한 팝업 관리 ver 0.1</title>
<style> // CSS로 레이어 팝업창의 위치 지정
div#popup {
position: absolute; top:100px; left:50px; color:yellow;
width:270px; height:100px; background-color:gray;
}
div#popup>div {
position: relative; background-color:#ffffff; top:0px;
border:1px solid gray; padding:10px; color:black;
}
</style>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>
$(function() {
$('#closeBtn').click(function() { // 닫기 버튼을 누르면
$('#popup').hide(); // 팝업창을 숨김 처리한다
});
});
</script>
</head>
<body>
<h2>팝업 메인 페이지(ver 0.1)</h2>
<%
for (int i = 1 ; i <= 10 ; i++) {
out.print("현재 팝업창은 " + popupMode + " 상태입니다.<br/>");
}
if (popupMode.equals("on")) { // popupMode 값이 "on"일 때만 팝업창 표시
%>
<div id="popup">
<h2 align="center">공지사항 팝업입니다.</h2>
<div align="right"><form name="popFrm">
<input type="checkbox" id="inactiveToday" value="1" /> // 체크박스
하루 동안 열지 않음
<input type="button" value="닫기" id="closeBtn" /> // 닫기 버튼
</form></div>
</div>
<%
}
%>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String popupMode = "on";
Cookie[] cookies = request.getCookies(); // 쿠키를 읽어 popupMode 값 설정
if (cookies != null) {
for (Cookie c : cookies) {
String cookieName = c.getName();
String cookieValue = c.getValue();
if (cookieName.equals("PopupClose")) { // PopupClose 쿠키가 존재하면
popupMode = cookieValue; // popupMode의 값 갱신
}
}
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>쿠키를 이용한 팝업 관리</title>
<style>
div#popup{
position: absolute; top:100px; left:100px; color:yellow;
width:300px; height:100px; background-color:gray;
}
div#popup>div{
position: relative; background-color:#ffffff; top:0px;
border:1px solid gray; padding:10px; color:black;
}
</style>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>
$(function() {
$('#closeBtn').click(function() { // 닫기 버튼을 누르면 실행되는 함수
$('#popup').hide();
var chkVal = $("input:checkbox[id=inactiveToday]:checked").val(); // 체크 여부
$.ajax({ // jQuerydml ajax() 함수로 비동기 요청
url : './PopupCookie.jsp',
type : 'get',
data : {inactiveToday : chkVal},
dataType : "text",
success : function(resData) { // 요청 성공 시 호출되는 함수
if (resData != '') location.reload();
}
});
});
});
</script>
</head>
<body>
<h2>팝업 메인 페이지</h2>
<%
for (int i = 1; i <= 10; i++) {
out.print("현재 팝업창은 " + popupMode + " 상태입니다.<br/>");
}
if (popupMode.equals("on")) {
%>
<div id="popup">
<h2 align="center">공지사항 팝업입니다.</h2>
<div align="right"><form name="popFrm">
<input type="checkbox" id="inactiveToday" value="1" />
하루 동안 열지 않음
<input type="button" value="닫기" id="closeBtn" />
</form></div>
</div>
<%
}
%>
</body>
</html>
PopupCookie.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" trimDirectiveWhitespaces="true"%>
<%
String chkVal = request.getParameter("inactiveToday");
if (chkVal != null && chkVal.equals("1")) {
Cookie cookie = new Cookie("PopupClose", "off"); // 쿠키 생성
cookie.setPath(request.getContextPath()); // 경로 설정
cookie.setMaxAge(60*60*24); // 유지 기간 설정
response.addCookie(cookie); // 응답 객체에 추가
out.println("쿠키 : 하루 동안 열지 않음");
}
%>
JSFunction.java
package utils;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.JspWriter;
public class JSFunction {
// 메시지 알림창을 띄운 후 명시한 URL로 이동합니다.
public static void alertLocation(String msg, String url, JspWriter out) {
try {
String script = "" // 삽입할 자바스크립트 코드
+ "<script>"
+ " alert('" + msg + "');"
+ " location.href='" + url + "';"
+ "</script>";
out.println(script); // 자바스크립트 코드를 out 내장 객체로 출력(삽입)
}
catch (Exception e) {}
}
// 메시지 알림창을 띄운 후 이전 페이지로 돌아갑니다.
public static void alertBack(String msg, JspWriter out) {
try {
String script = ""
+ "<script>"
+ " alert('" + msg + "');"
+ " history.back();"
+ "</script>";
out.println(script);
}
catch (Exception e) {}
}
}
자바스크립트 코드를 문자열 형태로 선언한 뒤 out 객체로 출력.
CookieManager.java
package utils;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CookieManager {
// 명시한 이름, 값, 유지 기간 조건으로 새로운 쿠키를 생성합니다.
public static void makeCookie(HttpServletResponse response, String cName,
String cValue, int cTime) {
Cookie cookie = new Cookie(cName, cValue); // 쿠키 생성
cookie.setPath("/"); // 경로 설정
cookie.setMaxAge(cTime); // 유지 기간 설정
response.addCookie(cookie); // 응답 객체에 추가
}
// 명시한 이름의 쿠키를 찾아 그 값을 반환합니다.
public static String readCookie(HttpServletRequest request, String cName) {
String cookieValue = ""; // 반환 값
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie c : cookies) {
String cookieName = c.getName();
if (cookieName.equals(cName)) {
cookieValue = c.getValue(); // 반환 값 갱신
}
}
}
return cookieValue;
}
// 명시한 이름의 쿠키를 삭제합니다.
public static void deleteCookie(HttpServletResponse response, String cName) {
makeCookie(response, cName, "", 0);
}
}
IdSaveMain.jsp
<%@ page import="utils.CookieManager"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String loginId = CookieManager.readCookie(request, "loginId");
String cookieCheck = "";
if (!loginId.equals("")) {
cookieCheck = "checked";
}
%>
<html>
<head><title>Cookie - 아이디 저장하기</title></head>
<body>
<h2>로그인 페이지</h2>
<form action="IdSaveProcess.jsp" method="post">
아이디 : <input type="text" name="user_id" value="<%= loginId %>" />
<input type="checkbox" name="save_check" value="Y" <%= cookieCheck %> />
아이디 저장하기
<br />
패스워드 : <input type="text" name="user_pw" />
<br />
<input type="submit" value="로그인하기" />
</form>
</body>
</html>
IdSaveProcess.jsp
<%@ page import="utils.CookieManager"%>
<%@ page import="utils.JSFunction"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String user_id = request.getParameter("user_id");
String user_pw = request.getParameter("user_pw");
String save_check = request.getParameter("save_check");
if ("must".equals(user_id) && "1234".equals(user_pw)) {
// 로그인 성공
if (save_check != null && save_check.equals("Y")) {
CookieManager.makeCookie(response, "loginId", user_id, 86400);
}
else {
CookieManager.deleteCookie(response, "loginId");
}
JSFunction.alertLocation("로그인에 성공했습니다.", "IdSaveMain.jsp", out);
}
else {
// 로그인 실패
JSFunction.alertBack("로그인에 실패했습니다.", out);
}
%>
로그인에 성공하면 [아이디 저장하기] 체크 여부를 확인하여, 체크가되있으면 쿠키를 생성, 아니라면 기존 쿠키를 삭제.
그리고 나서 로그인 성공 알림창을 띄운 후 메인 페이지로 이동.
로그인에 실패하면 로그인 실패 알림창을 띄워준 후 이전 페이지로 돌아감.