■ 쿠키(Cookie)란?
▶ URL 인코딩을 하여 저장하면 됩니다.
─────
쿠키의 사용 I : 쿠키 객체 생성
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("/cookieEx/Servlet01") public class Servlet01 extends HttpServlet { private static final long serialVersionUID = 1L; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException { /* 1) 쿠키 생성 */ Cookie cookie = new Cookie("c1", "aaaaaa"); /* 2) 쿠키를 응답 헤더에 포함시켜 보내기 HTTP/1.1 200 Set-Cookie: c1=aaaaaa <----- 쿠키 데이터가 이렇게 헤더에 추가됨. Content-Type: text/plain;charset=UTF-8 Content-Length: 29 Date: Mon, 12 Jun 2017 03:35:03 GMT */ resp.addCookie(cookie); resp.setContentType("text/plain;charset=UTF-8"); PrintWriter out = resp.getWriter(); out.println("Servlet01: 쿠키 보냈음."); } }
▶ 서버를 실행하고 웹브라우저 url 주소에 localhost:8080/프로젝트명/cookieEx/Servlet01 을 입력하면 쿠키가 생성되어 웹브라우저에 저장됩니다.
────
웹브라우저에 저장된 쿠키의 값을 읽기
mport 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; /* 쿠키 읽기 I * => 웹브라우저가 보낸 쿠키 정보를 읽기 */ @WebServlet("/cookieEx/CookieReader01") public class CookieReader01 extends HttpServlet { private static final long serialVersionUID = 1L; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException { resp.setContentType("text/plain;charset=UTF-8"); PrintWriter out = resp.getWriter(); /* 1) 요청 헤더에서 쿠키 정보를 추출하기 * => 웹브라우저가 쿠키를 보내지 않았다면, null을 리턴한다. GET /프로젝트명/cookieEx/CookieReader01 HTTP/1.1 Host: localhost:8080 Connection: keep-alive Pragma: no-cache Cache-Control: no-cache Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,
*... Accept-Encoding: gzip, deflate, sdch, br Accept-Language: ko-KR,ko;q=0.8,en-US;q=0.6,en;q=0.4 Cookie: c1=aaaaaa <------------ 웹브라우저가 웹서버에 보내는 쿠키 데이터 */ Cookie[] cookies = req.getCookies(); // 2) 읽은 쿠기 정보 출력하기 if (cookies != null) { for (Cookie cookie : cookies) { out.printf("%s=%s\n", cookie.getName(), // 쿠키 이름 cookie.getValue()); // 쿠키 값 } } else { out.println("쿠키가 한 개도 없습니다."); } } }
▶ 서버를 실행시킨 후 웹브라우저 url 주소에 localhost:8080/프로젝트명/cookieEx/CookieReader01 을 입력하면 저장된 쿠키의 이름과 값이 출력됩니다.
─────
쿠키의 사용 II : 사용 범위 지정
cookie.setPath(req.getContextPath());
▶ 쿠키의 사용 범위를 지정해주지 않으면 쿠키를 보낸 서블릿의 경로에
한정됩니다. 따라서 쿠키의 사용 범위를 현재 웹 어플리케이션 전체로
지정하고 싶다면 setPath(주소) 함수를 이용해야 합니다.
▶ 여기서 req.getContextPath() 는 "/웹프로젝트명"과 동일합니다.
─────
쿠키의 사용 III : 사용 기간 지정
cookie.setMaxAge(60);
▶ 쿠키의 사용 기간을 지정하지 않으면 웹브라우저가 실행되는 동안만
쿠키가 보관됩니다. 웹브라우저를 '모두' 닫으면 사용 기간을 지정하지
않은 쿠키는 모두 소멸되어 버리는 것이죠.
▶ 사용 기간을 지정하면, 컴퓨터를 껐다 켜도 지정한 시간 만큼 유지할 수
있습니다. 웹브라우저는 보낼 쿠키를 검사할 때 사용 기간이 지난 쿠키는
제거합니다.
▶ 여기서 setMaxAge() 메서드의 파라미터로 넘어가는 값(60)의 단위는 '초'입니다.
─────
쿠키의 사용 IV : 한글 보내는 법
Cookie cookie = new Cookie("c4", URLEncoder.encode("ABC가각간", "UTF-8"));
▶ 만약 웹서버가 유니코드를 그대로 내보내는 서버가 아니라면, 위와 같이
개발자가 URL 인코딩을 직접 수행해야 합니다.
▶ 한글 "가각간"을 보내주기 위해선 URLEncoder 인스턴스의 encode()
메서드를 사용해야 하는 것입니다. 첫번째 아규먼트로 넘겨줄 값을,
두번째 아규먼트로 인코딩 형식을 지정해야 하죠.
▶ 웹서버가 유니코드 값을 보내더라도 웹브라우저 중에서는 유니코드를
처리할 수 없는 브라우저도 있기 때문에 개발자가 URL 인코딩을 해서
보내기를 권장합니다.
왜 URL 인코딩을 해야만 하는지에 대해선 이전 글을 참고해주세요 :)
2017/06/12 - [Programming/java] - [Java] URL 인코딩이란 무엇인가?
─────
쿠키의 사용 V : 한글로 인코딩 된 쿠키 값을 읽기
import java.io.IOException; import java.io.PrintWriter; import java.net.URLDecoder; 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; /* 쿠키 읽기 III * => 쿠키 값이 URL 인코딩 되어 있을 때, * 개발자가 직접 URL 디코딩을 수행해야 한다. * */ @WebServlet("/cookieEx/CookieReader03") public class CookieReader03 extends HttpServlet { private static final long serialVersionUID = 1L; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException { resp.setContentType("text/plain;charset=UTF-8"); PrintWriter out = resp.getWriter(); Cookie[] cookies = req.getCookies(); if (cookies != null) { for (Cookie cookie : cookies) { out.printf("%s=%s\n", cookie.getName(), // 쿠키 이름 URLDecoder.decode(cookie.getValue(), "UTF-8")); // 영어는 URL 디코딩해도 값이 같다. 그러니 영어를 디코딩하는 것에 대해 걱정말라! } } else { out.println("쿠키가 한 개도 없습니다."); } } }
▶ URLEncoder를 통해 인코딩 된 쿠키 데이터(한글 값)는 URLDecoder의
decode() 메서드를 통해 디코딩 시켜주어야 합니다.
▶ decode() 메서드에 넣어주는 첫번째 아규먼트는 쿠키 데이터, 두번째
아규먼트는 디코딩 형식입니다.
▶ 영어는 URL 디코딩을 해도 값이 달라지지 않습니다. 그러니 영어를
디코딩하는 것에 대해선 걱정마세요 :)
'Programming > java' 카테고리의 다른 글
[Java] 클래스 정보 얻기 - 리플렉션(reflection)이란? (0) | 2017.06.20 |
---|---|
[Java] JSP란 무엇일까? JSP를 사용하는 이유와 사용법을 익혀보자! (0) | 2017.06.19 |
[Java] URL 인코딩이란 무엇인가? (2) | 2017.06.12 |
[Java] 웹 어플리케이션 구성 요소 (1) ServletListener (0) | 2017.06.09 |
[Java][Gradle] 이클립스를 이용해 gradle에 대해 배워보자 ! :: gradle 사용법과 이클립스 설정 파일 만들기 (0) | 2017.06.08 |