특정 쿠키의 값을 읽으려면 다음과 같은 형태의 코드를 작성해야 한다.
Cookie[] cookies = request.getCookies();
Cookie nameCookie = null;
Cookie idCookie = null;
if(cookies != null){
for(int i = 0; i < cookies.length; i++){
if(cookies[i].getName().equals("name")){
nameCookie = cookies[i];
}else if(cookies[i].getName().equals("id")){
idCookie = cookies[i];
}
}
}
String name = URLDecoder.decode(nameCookie.getValue(), "utf-8");
...
위 코드는 Cookie 목록을 가져와 if-else 블록에서 쿠키 이름을 비교해서 필요한 쿠키를 구하고 있다. 이런 구조는 사용할 쿠키가 많아질수록 if-else 코드가 복잡해지는 문제가 있다. 그래서 더욱 편리하게 쿠키를 사용할 수 있도록 도와주는 보조 유틸리티 클래스를 아래 예제 코드와 같이 작성해보았다.
package util;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.Map;
public class Cookies {
private Map<String, Cookie> cookieMap = new java.util.HashMap<String, Cookie>();
public Cookies(HttpServletRequest request){
Cookie[] cookies = request.getCookies();
if(cookies != null){
for(int i = 0; i < cookies.length; i++){
cookieMap.put(cookies[i].getName(), cookies[i]);
}
}
}
public Cookie getCookie(String name){
return cookieMap.get(name);
}
public String getValue(String name) throws IOException{
Cookie cookie = cookieMap.get(name);
if(cookie == null){
return null;
}
return URLDecoder.decode(cookie.getValue(), "euc-kr");
}
public boolean exists(String name){
return cookieMap.get(name) != null;
}
public static Cookie createCookie(String name, String value) throws IOException{
return new Cookie(name, URLEncoder.encode(value, "utf-8"));
}
public static Cookie createCookie(String name, String value, String path, int maxAge) throws IOException{
Cookie cookie = new Cookie(name, URLEncoder.encode(value, "utf-8"));
cookie.setPath(path);
cookie.setMaxAge(maxAge);
return cookie;
}
public static Cookie createCookie(String name, String value, String domain, String path, int maxAge) throws IOException{
Cookie cookie = new Cookie(name, URLEncoder.encode(value, "utf-8"));
cookie.setDomain(domain);
cookie.setPath(path);
cookie.setMaxAge(maxAge);
return cookie;
}
}
Cookies 클래스를 사용하려면 먼저 Cookies.java를 컴파일해서 Cookies.class를 생성해야 한다. Cookies.java 파일의 컴파일 방법은 명령 프롬프트에서 다음과 같은 순서로 명령어를 실행하면 된다. Cookies 클래스가 사용하는 Cookies 클래스는 서블릿 API에 포함되어 있으므로 톰캣의 servlet-api.jar 파일을 클래스패스에 추가했다. 다음 코드에서 C:..\WEB-INF는 C:\apache-tomcat-8.0.21\webapps\chap09\WEB-INF를 줄여서 표현한 것이다.
javac 명령어까지 실행하면 WEB-INF\classes\lib 폴더에 Cookies.class 파일이 생성되었을 것이다. Cookies 클래스를 사용해서 쿠키 처리 코드를 간단하게 작성할 수 있다.
Cookies 클래스로 쿠키를 생성하는 방법을 알아보자. 쿠키를 생성할 때에는 Cookies.createCookie() 메서드를 사용한다. Cookies 클래스는 세 가지 createCookies() 메서드를 제공하며, 다음과 같이 사용할 수 있다.
Cookie cookie1 = Cookies.createCookie("name", "최범균");
Cookie cookie2 = Cookies.createCookie("name2", "최범균", "/path1", -1);
Cookie cookie3 = Cookies.createCookie("id", "jsp", ".madvirus.net", "/", 60);
Cookie 클래스를 직접 사용하면 다음과 같이 도메인, 경로, 유효시간을 설정할 때 입력할 코드가 많아지는데, Cookies 클래스를 사용하면 코드가 간결해지는 것을 알 수 있다.
Cookie cookie = new Cookie("id", URLEncoder.encode(value, "utf-8"));
cookie.setDomain(".madvirus.net");
cookie.setPath("/");
cookie.setMaxAge(60);
아래 코드는 Cookies.createCookie() 메서드를 사용해서 쿠키를 생성하는 JSP 코드이다.
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="util.Cookies" %>
<%
response.addCookie(Cookies.createCookie("name", "최범균"));
response.addCookie(Cookies.createCookie("id", "madvirus", "/chap09", -1));
%>
<html>
<head>
<title>사용 예</title>
</head>
<body>
Cookies를 사용하여 쿠키 생성
</body>
</html>
웹 브라우저가 전송한 쿠키를 읽으려면 다음과 같이 Cookies 객체를 생성한 후 getCookie(), getValue(), exists() 등의 메서드를 사용하면 된다.
// request 기본 객체로부터 쿠키 정보를 읽어온다.
Cookies cookies = new Cookies(request);
// 쿠키가 존재하는 지 확인
if(cookies.exists("name")){
// Cookie 클래스로 사용할 경우 getCookie() 메서드 사용
Cookie cookie = cookies.getCookie("name");
...
}
if(cookies.exists("id")){
// 값만 사용할 경우 getValue() 메서드 사용
Cookie cookie = cookies.getValue("name");
...
}
이 코드를 보면 Cookies 클래스를 사용함으로써 쿠키를 사용하는 코드가 간결해지고 가독성이 향상된 것을 확인할 수 있다. 아래 코드는 Cookies 클래스를 사용해서 앞에서 작성한 makeCookieUsingCookies.jsp가 생성한 쿠키의 값을 출력하는 코드이다.
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="util.Cookies" %>
<%
Cookies cookies = new Cookies(request);
%>
<html>
<head>
<title>Cookies 사용</title>
</head>
<body>
name 쿠키 = <%=cookies.getValue("name")%><br>
<% if(cookies.exists("id")){ %>
id 쿠키 = <%=cookies.getValue("id")%> <br>
<% } %>
</body>
</html>
웹 브라우저에서 makeCookieUsingCookies.jsp를 실행한 뒤, readCookieUsingCookies.jsp를 실행하면 아래와 같이 Cookies 클래스가 올바르게 동작하는 것을 확인할 수 있다.
참고