본문 바로가기

Servlet & JSP

Servlet & JSP에서 Cookie 사용법

다음은 오라클에서 설명하는 Cookie 클래스이다.

읽어보면 도움이 되니 읽어보는 것을 추천한다!

docs.oracle.com/javaee/7/api/javax/servlet/http/Cookie.html

 

Cookie (Java(TM) EE 7 Specification APIs)

Creates a cookie, a small amount of information sent by a servlet to a Web browser, saved by the browser, and later sent back to the server. A cookie's value can uniquely identify a client, so cookies are commonly used for session management. A cookie has

docs.oracle.com

 

처음해보는 Servlet & JSP 웹프로그래밍 / 출판 Ruby paper

쿠키는 웹서버에서 클라이언트(사용자의 브라우저)로 부여해주는 방식으로 필요할 때마다 추출해간다.

 

쿠키 사용 시기

서버와 클라이언트의 연결이 끊어져도 클라이언트에서 개별적으로 상태 정보를 유지할 필요가 있을 때

 

쿠키 생성

 

쿠키 생성

javax.servlet.http.Cookie을 import한 상태에서

Cookie 변수명 = new Cookie(String name, String value);

형식으로 생성하며, name에 value값이 부여되는 형식으로 한번 설정된 name은 수정할 수 없다.

 

쿠키는 유효 기간을 가질 수 있으며

setMaxAge(int expiry)로 설정 가능하다. 단위는 '초'이며,

0 이면 쿠키 삭제

음수값이면 브라우저가 종료되면 쿠키도 자동으로 삭제. 지정하지 않아도 음수값으로 적용

 

쿠키 경로 설정

setPath(String uri)

지정된 경로와 그 하위 경로의 요청에 대해서만 클라이언트로부터 쿠키가 전송

 

쿠키 도메인 설정

setDomain(String domain)

(default)기본적으로 전송된 서버에서만 읽어 들여 사용함

www.edu.com 과 같이 지정하면 정확히 일치하는 도메인만 가능

.(dot)으로 시작하는 도메인을 지정하면 그 해당 도메인이 포함된 도메인 서버에서 읽을 수 있다. (예, .edu.com -> it.edu.com(가능), .avcedu.com(불가능)

 

쿠키 전송

addCookie(Cookie cookie)

생성된 쿠키를 클라이언트로 보낼때는 HttpServlet 객체의 addCookie( ) 메소드 이용.

 

아래는 예시이다.

package com.edu.test.cookie;

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

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("/cookie1")
public class CookieTest1Servelet extends HttpServlet{
	@Override
	public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		resp.setContentType("text/html;charset=UTF-8"); // 응답 utf-8 형식
		PrintWriter out = resp.getWriter();
		
		Cookie c1 = new Cookie("id", "guest"); // 이름 id에 guest 값 부여
		c1.setPath("/");		// 유효기간 default로 음수 지정되어 브라우저 닫힘과 동시에 쿠키 삭제됨
		resp.addCookie(c1);
		
		Cookie c2 = new Cookie("code", "0001"); // 이름 code에 0001 값 부여
		c2.setPath("/");
		c2.setMaxAge(60 * 60 * 3);	// 유효기간 3시간
		//c2.setMaxAge(-1);
		resp.addCookie(c2);
		
		Cookie c3 = new Cookie("subject", "java");	// 이름 subject에 java 값 부여
		c3.setPath("/");
		c3.setMaxAge(60 * 60 * 24);		// 유효기간 1일
		//c3.setMaxAge(-1);
		resp.addCookie(c3);
		
		out.println("쿠키 전송 완료");
		out.close();
	}
}

 

쿠키 추출

쿠키 추출

Cookie[ ]  Arr = HttpServletRequest.getCookies()

서버 쪽에서 쿠키를 읽어 들이기 위해 HttpServletRequest 객체의 getCookies() 메소드를 이용한다.

 

Cookie 검색

String getName()

쿠키를 검색할 때는 쿠키의 이름을 가지고 검색하며, 쿠키의 이름만을 추출할 때 사용한다.

 

Cookie 값 추출

String getValue()

검색한 쿠키의 값을 추출할 때 사용

 

아래는 예시

package com.edu.test.cookie;

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

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("/cookie2")
public class CookieTest2Servlet extends HttpServlet {
	@Override
	public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		resp.setContentType("text/html;charset=UTF-8");
		PrintWriter out = resp.getWriter();
		
		Cookie[] list = req.getCookies();		// 모든 쿠키 값을 배열에 저장
		/*
		for(int i = 0; list != null && i< list.length; ++i) {	// 일반 for문으로 cookie 값이 리스트에 있고 개수만큼 확인
			out.println(list[i].getName() + " : " + list[i].getValue() + "<br>");
		}
		*/
		for(Cookie cookie : list) {		// 배열 for문으로 확인
			out.println(cookie.getName() + " : " + cookie.getValue() + "<br>");
		}
		out.println("Print finish");
		out.close();
	}
}

 

 

현재 클라이언트의 쿠키 정보 값을 읽어서 갱신하기

 

package com.edu.test.cookie;

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

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("/cookie3")
public class CookieTest3Servlet extends HttpServlet {
	@Override
	public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		int cnt = 0;
		Cookie[] list = req.getCookies();			// 쿠키 값을 받아서 저장
		/*
		for(int i =0; list!=null && i < list.length; ++i) {
			if(list[i].getName().equals("count")) {	// 쿠키 이름이 count면 cnt에 값을 저장
				cnt = Integer.parseInt(list[i].getValue());
			}
		}
		*/
		for(Cookie cookie : list) {
			if(cookie.getName().equals("count")) {
				cnt = Integer.parseInt(cookie.getValue());
			}
		}
		
		cnt++;		// 방문 횟수 증가
		Cookie c = new Cookie("count", cnt+"");
		//c.setMaxAge(60 * 60 * 24);
		c.setMaxAge(-1);
		c.setPath("/");
		resp.addCookie(c);
		
		resp.setContentType("text/html;charset=UTF-8");
		PrintWriter out = resp.getWriter();
		out.print("<h1>방문 횟수 : " + cnt);
		out.close();
	}
}