[Java] Cookie

쿠키 - 클라이언트에 저장되어있다가 뭐랬더라?

  • 로그인 성공시 쿠키에 저장할 데이터 설정
  • 쿠키에 데이터 저장
  • 저장된 쿠키가 사이트 접속시 자동으로 같이 감
  • 로그인 여부확인을 위해 쿠키를 읽어옴
  • 로그아웃하면 쿠키데이터 지움

CookieTest_jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Cookie 연습</title>
</head>
<body>
<a href = "<%=request.getContextPath()%>/cookieAddTest.do">
	Cookie 정보 저장하기
</a><br><hr><br>

<a href = "<%=request.getContextPath()%>/cookieReadTest.do">
	Cookie 정보 확인하기
</a><br><hr><br>

<a href = "<%=request.getContextPath()%>/cookieDeleteTest.do">
	Cookie 정보 삭제하기
</a><br><hr><br>

</a>
</body>
</html>

Cookie 저장법

1.Cookie 객체를 생성한다. 쿠키변수와 쿠키값이 필요하다. 쿠키변수와 쿠키값은 문자열로 지정한다. 쿠키는 문자열밖에 저장을 못하기 때문에.
형식) Cookie cookie변수 = new Cookie('쿠키변수', '쿠키값');
쿠키값으로 한글을 사용할 경우 URLEncoding.encode()메서드로 인코딩 후 저장한다.
2. 쿠키 속성 설정
1) 쿠키변수.setPath("적용경로"); // 지정한 경로와 그 하위 경로에서 사용 가능하다.
생략하면 쿠키를 설정할 당시의 경로가 설정된다.
2) 쿠키변수.setMaxAge(유지시간); 단위(초)
유지시간이 음수 : 브라우저가 종료될 때까지 유지(기본값)
유지시간이 0 : 즉시 쿠키가 삭제된다.
3) 쿠키변수.setDomain("적용도메인명");
예) ".ddit.or.kr" 이면 www.ddit.or.kr이나 www2.ddit.or.kr도됨
쿠키변수.setSecure(보안여부); = > true:적용, false:미적용(기본값) true인 경우 http에서 못씀
3. response객체를 이용하여 쿠키를 웹브라우저로 보내면 웹브라우저가 이 쿠키를 받아서 저장한다.
형식) response객체.addCookie(1번에서 만든 Cookie객체)

package kr.or.ddit.basic.cookie;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLEncoder;

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("/cookieAddTest.do")
public class CookieAddTest extends HttpServlet {
	private static final long serialVersionUID = 1L;


	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		response.setCharacterEncoding("utf-8");
		
		response.setContentType("text/html; charset=utf-8");
		PrintWriter out = response.getWriter();
		
		// Cookie 저장법
		// 1. Cookie 객체를 생성한다. 쿠키변수와 쿠키값이 필요하다. 쿠키변수와 쿠키값은 문자열로 지정한다. 쿠키는 문자열밖에 저장을 못하기 때문
		// 형식) Cookie cookie변수 = new Cookie('쿠키변수', '쿠키값');
		// 쿠키값으로 한글을 사용할 경우 URLEncoding.encode()메서드로 인코딩 후 저장한다.
		
		Cookie nameCookie = new Cookie("name", URLEncoder.encode("홍길동", "UTF-8"));
		Cookie ageCookie = new Cookie("age", String.valueOf(30)); // 숫자는 문자열로 변환해야한다.
		Cookie cityCookie = new Cookie("city", "seoul");
		
		// 2. 쿠키 속성 설정
		//1) 쿠키변수.setPath("적용경로"); // 지정한 경로와 그 하위 경로에서 사용 가능하다.
		// 생략하면 쿠키를 설정할 당시의 경로가 설정된다. 
		//2) 쿠키변수.setMaxAge(유지시간); 단위(초)
		// 유지시간이 음수 : 브라우저가 종료될 때까지 유지(기본값)
		// 유지시간이 0 : 즉시 쿠키가 삭제된다.
		//3) 쿠키변수.setDomain("적용도메인명");
		// 예) ".ddit.or.kr" 이면 www.ddit.or.kr이나 www2.ddit.or.kr도됨
		// 쿠키변수.setSecure(보안여부); = > true:적용, false:미적용(기본값) true인 경우 http에서 못씀 
		
		
		// 3. response객체를 이용하여 쿠키를 웹브라우저로 보내면 웹브라우저가 이 쿠키를 받아서 저장한다.
		// 형식) response객체.addCookie(1번에서 만든 Cookie객체)
		response.addCookie(nameCookie);
		response.addCookie(ageCookie);
		response.addCookie(cityCookie);
		
		out.println("<html><head><meata charset='utf-8'>");
		out.println("<title>Cookie연습</title></head>");
		out.println("<body>");
		out.println("<h2>Cookie 데이터가 저장되었습니다.</h2>");
		
		out.println("<a href = '" +request.getContextPath()+ "/cookie/cookieTest.jsp'> 시작문서로 가기</a>");
		out.println("</body><html>");
		
	}

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

저장된 Cookie정보 읽어오기

  1. 전체 Cookie정보를 Request객체를 이용해서 가져온다.
    가져온 Cookie 정보들은 배열에 저장된다.
    형식) Cookie[] 쿠키배열변수 = request.getCookie();
    2.쿠키 배열에서 해당 쿠키 정보를 구해온다.
package kr.or.ddit.basic.cookie;

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;


@WebServlet("/cookieReadTest.do")
public class CookieReadTest extends HttpServlet {
	private static final long serialVersionUID = 1L;

	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setCharacterEncoding("utf-8");
		response.setContentType("text/html; cahrset=utf-8");
		
		PrintWriter out = response.getWriter();
		
		// 저장된 Cookie정보 읽어오기
		// 1. 전체 Cookie정보를 Request객체를 이용해서 가져온다.
		// 가져온 Cookie 정보들은 배열에 저장된다.
		// 형식) Cookie[] 쿠키배열변수 = request.getCookie();
		Cookie[] cookieArr = request.getCookies();
		
		out.println("<html><head><meata charset='utf-8'>");
		out.println("<title>Cookie 읽기연습</title></head>");
		out.println("<body>");
		out.println("<h2>저장된 Cookie데이터 확인하기</h2>");
		
		if(cookieArr==null || cookieArr.length==0) {
			out.println("<h2> 저장된 쿠키가 하나도 없습니다. </h2>");
		}else {
			// 2.쿠키 배열에서 해당 쿠키 정보를 구해온다.
			for(Cookie cookie : cookieArr) {
				String name = cookie.getName(); //쿠키변수구하기
				//String value = cookie.getValue(); //쿠키값구하기
				
				// 쿠키값으로 저장된 데이터가 한글일 경우 디코딩해서 사용한다.
				String value = URLDecoder.decode(cookie.getValue(), "utf-8");
				
				out.println("쿠키변수: "+ name + "<br>");
				out.println("쿠키값: "+ value + "<hr>");
				
			}
			
		}
		
		out.println("<a href = '" +request.getContextPath()+ "/cookie/cookieTest.jsp'> 시작문서로 가기</a>");
		out.println("</body><html>");
		
		}

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

Cookie 삭제

  1. 쿠키 데이터의 삭제는 쿠키의 유지시간을 0으로 설정하는 방법을 사용한다.
  • 먼저 삭제할 쿠기를 구한 후 이 쿠키의 유지시간을 0으로 설정한 후 addCookie()메서드로 다시 저장하면 된다.
package kr.or.ddit.basic.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("/cookieDeleteTest.do")
public class CookieDeleteTest extends HttpServlet {
	private static final long serialVersionUID = 1L;

	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	
		// 저장된 Cookie 삭제하기
		response.setCharacterEncoding("utf-8");
		response.setContentType("text/html; charset=utf-8");
		PrintWriter out = response.getWriter();
		
		// 1. 쿠키 데이터의 삭제는 쿠키의 유지시간을 0으로 설정하는 방법을 사용한다. 
		// 먼저 삭제할 쿠기를 구한 후 이 쿠키의 유지시간을 0으로 설정한 후 addCookie()메서드로 다시 저장하면 된다.
		
		Cookie[] cookieArr = request.getCookies();
		
		out.println("<html><head><meata charset='utf-8'>");
		out.println("<title>Cookie 삭제연습</title></head>");
		out.println("<body>");
		out.println("<h2>저장된 Cookie 데이터 삭제하기 </h2> ");
		
		if(cookieArr==null || cookieArr.length==0) {
			out.println("<h3>삭제할 쿠키가 하나도 없습니다.</h3>");
		}else {
			//반복문을 사용해서 삭제할 쿠키를 찾는다. 
			
			for(Cookie cookie : cookieArr) {
				String name = cookie.getName(); // '쿠키변수'값 구하기
				
				// 예:city쿠키변수에 저장된 쿠키삭제하기
				if("city".equals(name)) { // 삭제할 쿠키 찾기
					cookie.setMaxAge(0); // 유지시간을 0으로 설정한다.
					response.addCookie(cookie); // 변경된 쿠키를 저장한다.
				}
			}
		}
		
		
		out.println("<a href = '" +request.getContextPath()+ "/cookie/cookieTest.jsp'>시작문서로 가기</a>");
		out.println("</body><html>");
		
		
		
	}

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
	}

}

쿠키예제1


jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
   pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">
div{
border: 1px solid black;
width: 300px;
height: 100px;
}
</style>
</head>
<body>
<div>

<a href = "<%=request.getContextPath()%>/cookieCountServlet.do">
	Cookie Count 증가하기</a>


<br><br>

<a href = "<%=request.getContextPath()%>/cookieCountDelServlet.do">
	Cookie Count 초기화 하기 </a>
	<br><br>

</div>

</body>
</html>

서블릿

package kr.or.ddit.basic.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;

/**
 * Servlet implementation class CookieCountServlet
 */
@WebServlet("/cookieCountServlet.do")
public class CookieCountServlet extends HttpServlet {
//	int num=0;
	private static final long serialVersionUID = 1L;


	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		
		response.setContentType("text/html; charset=utf-8");
		PrintWriter out = response.getWriter();
		
	
	//	num++;
		
		
		//count라는 쿠키가 있는지 검사한다.
		Cookie[] cookies = request.getCookies();
		
		int num= 0;
		if(cookies!=null) {
			for(Cookie cookie : cookies) {
				String name = cookie.getName(); //쿠키변수 구하기
				if("count".equals(name)) {
					//현재의 count값구하기
					num = Integer.parseInt(cookie.getValue());
					break;
				}
			}
		}
		
		num++;
		
		// 증가된 count값을 저장한다.
		
		Cookie count = new Cookie("count", String.valueOf(num)); // 숫자는 문자열로 변환해야한다.
		response.addCookie(count);
		
		out.println("<html><head><meata charset='utf-8'>");
		out.println("<title></title></head>");
		out.println("<body>");
		out.println("<h2>어서오세요. 당신은 "+ count.getValue()+ "번째 방문입니다. </h2>");
		
		
		out.println("<a id='aid' href = '" +request.getContextPath()+ "/cookieCountServlet.do' >카운트 증가하기</a>");
		
		out.println("<a href = '" +request.getContextPath()+ "/cookie/cookieTest02.jsp'>시작문서로 가기</a>");
		out.println("</body><html>");
		
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

쿠키를 이용해서 아이디 기억하는 예제

Main_jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<h2>cookie 연습용 main 페이지 입니다.</h2>

<a href = "<%=request.getContextPath()%>/cookie/cookieLogin.jsp">
	login창으로 이동
</a>
</body>

</html>

Login_jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">
div{
border: 1px solid black;
width: 300px;
height: 100px;
}

label{

margin:10px;
}

</style>
</head>
<body>
<%
	// 스크립트릿영역 => java코드를 작성하는 영역
	// 쿠키값 구하기(쿠키변수가 userId인 쿠키값 구하기)
	Cookie[] cookies = request.getCookies();
	
	String cookieUserId = ""; // 쿠키에 저장된 userid값이 저장될 변수
	String chk = ""; //체크박스 체크용 변수
	
	if(cookies!=null){
		for(Cookie c : cookies){
			if("id".equals(c.getName())){ //원하는 쿠키 변수 찾기
				cookieUserId = c.getValue(); // 쿠키값 구하기
				chk = "checked";
				
			}
		}
	}
		
	
%>
<div>

<form action="<%=request.getContextPath()%>/cookieLoginServlet.do" >

 <label>아이디:</label>
    <input type="text" id="id" name="id" value="<%=cookieUserId%>" placeholder="ID를 입력하세요"><br>
    
 <label>비밀번호: </label>
    <input type="password" id="pass" name="pass" placeholder="PassWord를 입력하세요" ><br>
    
   <label><input type="checkbox" name="check" <%=chk%> value="1" >id기억하기 </label><br>
    <input type="submit" value="로그인">
    
</form>

</div>
</body>

<script type="text/javascript">


</script>

서블릿

package kr.or.ddit.basic.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;

// 아이디 패스워드가 test, 1234인지 확인
// 맞으면 홈으로 아니면 체크박스유무에 따라 다시 보여줌.



@WebServlet("/cookieLoginServlet.do")
public class CookieLoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		response.setCharacterEncoding("UTF-8");
		response.setContentType("text/html; charset=utf-8");
		
		PrintWriter out = response.getWriter();
		String id = request.getParameter("id");	
		String pass = request.getParameter("pass");	
		String check = request.getParameter("check");	
		
		//쿠키 객체 생성
		Cookie idc = new Cookie("id", id);
		Cookie passc = new Cookie("pass", pass);
		
		if(request.getParameter("check")!=null) { //체크박스를 눌렀으면
			
			// 쿠키저장
			response.addCookie(idc);		
			
		}else { //체크박스를 안눌렀으면
			
			//쿠키 삭제
			idc.setMaxAge(0);
			response.addCookie(idc);
			
				
		}
		
		if(idc.getValue().equals("test")&& passc.getValue().equals("1234")){ //잘입력했으면

			response.sendRedirect(request.getContextPath()+"/cookie/CookieMain.jsp");
			
		}else { //잘입력안했으면
			response.sendRedirect(request.getContextPath()+"/cookie/cookieLogin.jsp");
	
		}
		

	}
	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

좋은 웹페이지 즐겨찾기