WEB/JSP

18. Cookie & session

choi121xx 2013. 4. 23. 14:14

1. 쿠키


1) 서버가 클라이언트에 남기는 정보 부스러기


2) 제한 크기 : 4kb


3) 제한 갯수 : 300개


4) 종류

 - 클라이언트의 하드디스크에 저장되는 쿠키(파일형태로 저장)

 - 클라이언트의 메모리상에 저장되는 쿠키(웹브라우저를 닫으면 사라짐)

   setMaxAge()메소드로 유효시간을 저장하지 않으면 웹브라이저를 닫을때까지 유효


5) 한글은 지원되지 않는다. 한글을 저장하려면 인코딩을 설정해야 한다.


6) 클라이언트가 최초에 서버에 접속했을때는 쿠키는 전송되지 않고 두번째 요청시마다 쿠키가 자동전송된다.


7) 쿠기생성

  Cookie cook=new Cookie("쿠키이름","쿠키값");

  cook.setMaxAge(유지시간);

  response.addCookie(cook);


8) 쿠키수정

 - 동일한 이름의 쿠키를 만들어 response객체에 담는다.

   Cookie cooks = new Cookie("쿠키이름","수정값");

   cook.setMaxAge(유지시간);

   response.addCookie(cook);


9) 쿠키삭제

 - 동일한 이름의 쿠키를 만들어 유지시간을 0으로 준다.

  Cookie cook = new Cookie("쿠키이름","쿠키값");

  cook.setMaxAge(0);//쿠키유지시간을 0으로

  response.addCookie(cook); 





2. 세션


1) http프로토콜은 무상태프로토콜이기 때문에 상태를 저장할 수 없다.

  세션이라는 기술은 그 상태정보를 유지할수 있도록 하는 기술이다.


2) 원리

 - 클라이언트가 최초의 요청을 하면 서버측 메모리에 세션방이 만들어지고 JSESSIONID라는 ID로 해당 세션방에 접근할 수 있다. 클라이언트가 두번째 이상 요청시마다 JSESSIONID가 쿠키에 담겨 전송된다. 서버는 이 ID로 클라이언트를 식별해  세션방을 사용할 수 있도록 한다.  




EX1 >

로그인/아이디 입력 ( id/pwd ) --> 쿠키 생성  --> 쿠키 확인


login.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

</head>

<body>

<form method="post" action="loginOk.jsp">

아이디<input type="text" name="id"/><br/>

비밀번호<input type="password" name="pwd"/><br/>

<input type="submit" value="로그인"/>

</form>

</body>

</html>



loginOk.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

</head>

<body>

<%

//전송된 파라미터 얻어오기

String id=request.getParameter("id");

String pwd=request.getParameter("pwd");

// 전송된 파라미터를 쿠키에 담기

// 쿠키생성

Cookie cook1= new Cookie("id",id);


//쿠키유지시간 설정 (1분간 유효)

cook1.setMaxAge(60*1) ;

Cookie cook2 = new Cookie("pwd",pwd);

cook2.setMaxAge(60*2);

//응답객체에 쿠키를 담아서 클라이언트에 보내기

response.addCookie(cook1);

response.addCookie(cook2);

%>

쿠키가 생성되었습니다.<br/>

<a href="getCookie.jsp">다른 페이지로 이동하기</a><br/>

</body>

</html>



getCookie.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

</head>

<body>

<h2>쿠키 얻어오기</h2>

<%

//request객체를 통해 서버로 전달된 쿠키를 얻어온다.

//(쿠기는 무조건배열로 얻어옴.)

Cookie[] cook=request.getCookies();

//쿠키는 클라이언트가 최초로 서버에 요청할때는 전송되지 않으므로 

// 반드시 null 인지 체크해야 한다.

if(cook!=null){

for(int i=0;i<cook.length;i++){

//쿠키이름 얻어오기

String cookieName=cook[i].getName();

//쿠키값 얻어오기

String cookieValue=cook[i].getValue();

out.println("쿠키이름:" + cookieName + " 쿠키값:" + cookieValue + "<br/>");

}

}else{

%>

쿠키가 없어요.!!

<%

}

%>

</body>

</html>



EX2>

쿠키를 이용해서 최근 본 상품 보여주기



list.jsp 

<%@page import="java.net.URLDecoder"%>

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

</head>

<body>

<h2>판매제품목록</h2>

<ul>

<li><a href="1.jsp">냉장고</a></li>

<li><a href="2.jsp">컴퓨터</a></li>

<li><a href="3.jsp">핸드폰</a></li>

</ul>

<hr/>

<h5>최근 본 상품</h5>

<div>

<%

//쿠키 얻어오기

Cookie[] cook = request.getCookies();

if(cook!=null){

for(int i=0;i<cook.length;i++){

//전송된 쿠키이름 얻어오기

String name=cook[i].getName();

//쿠키이름에 item이 포함되어 있다면

if(name.indexOf("item")!=-1){

//해당 value얻어오기

String value=cook[i].getValue();

//euc-kr로 인코딩되어 있으므로 다시 euc-kr로 디코딩하여야 한다.

String item=URLDecoder.decode(value, "euc-kr");

out.println(item+"<br/>");

}

}

}else{

out.println("최근에 본 상품이 없습니다.");

}

%>

</div>

</body>

</html>





; 리스트에서 냉장고를 클릭하고 "제품목록페이지"로 다시 이동하면 [ 최근 본 상품 ]에 냉장고가 보인다.





1.jsp 냉장고

<%@page import="java.net.URLEncoder"%>

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

</head>

<body>

냉장고에 대한 상세 페이지입니다.<br/>

모델명 : xxx<br/>

제품가격:xxx원<br/>

<%

//상품에 대한 정보를 쿠키에 담기

//쿠키에 한글은 저장되지 않으므로 encode함수로 인코딩해야 한다.

Cookie cook = new Cookie("item1", URLEncoder.encode("냉장고","euc-kr"));

cook.setMaxAge(60*60);//1시간동안 유지

response.addCookie(cook);

%>

<a href="list.jsp">제품 목록 페이지</a><br/>

</body>

</html>


2.jsp 컴퓨터

<%@page import="java.net.URLEncoder"%>

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

</head>

<body>

컴퓨터에 대한 상세 페이지입니다.<br/>

모델명 : xxx<br/>

제품가격:xxx원<br/>

<%

//상품에 대한 정보를 쿠키에 담기

//쿠키에 한글은 저장되지 않으므로 encode함수로 인코딩해야 한다.

Cookie cook = new Cookie("item2", URLEncoder.encode("컴퓨터","euc-kr"));

cook.setMaxAge(60*60);//1시간동안 유지

response.addCookie(cook);

%>

<a href="list.jsp">제품 목록 페이지</a><br/>

</body>

</html>



3.jsp 핸드폰

<%@page import="java.net.URLEncoder"%>

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

</head>

<body>


핸드폰에 대한 상세 페이지입니다.<br/>

모델명 : xxx<br/>

제품가격:xxx원<br/>

<%

//상품에 대한 정보를 쿠키에 담기

//쿠키에 한글은 저장되지 않으므로 encode함수로 인코딩해야 한다.

Cookie cook = new Cookie("item3", URLEncoder.encode("핸드폰","euc-kr"));

cook.setMaxAge(60*60);//1시간동안 유지

response.addCookie(cook);

%>

<a href="list.jsp">제품 목록 페이지</a><br/>

</body>

</html>




EX 3>

페이지 시작 시 팝업창 보여주고, 팝업창 닫기 체크 시 쿠키에 저장하고, 지정 시간 만큼 안보여 주기



   


main.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

<script type="text/javascript">

function showPopup(){

<%

boolean check=false;

Cookie cook[]=request.getCookies();//전송된 쿠키 얻어오기

if(cook!=null){

for(int i=0;i<cook.length;i++){

String name=cook[i].getName();//쿠키이름 얻어오기

String value=cook[i].getValue();//쿠키값 얻어오기

if(name.equals("pop") && value.equals("no")){

check=true;

break;

}

}

}

if(!check){

%>

window.open("popup1.jsp","","width=300,height=200");

<%

}

%>

}

</script>

</head>

<body onload="showPopup()">

<div style="width:900px;height:600px;background-color: pink ">

<h2>우리우리 홈쇼핑</h2>

</div>

</body>

</html>



popup1.jsp

; 자신 페이지로 이동

; 쿠키에 담기

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

</head>

<body>

<div style="width:300px;height: 300px;background-color: yellow;">

<h3>많은 이벤트가 진행중이예요</h3>

<form method="post" action="popup1.jsp" name="frm">

<input type="checkbox" name="ck1" id="ck1" value="no"

onclick="document.frm.submit()"/>24시간동안 창보이지 않기

<hr/>

<a href="javascript:self.close()">닫기</a>

</form>

</div>

<%

//전송된 체크박스 얻어오기

String ck1=request.getParameter("ck1");

if(ck1!=null){//체크박스가 체크된 경우

%>

<script type="text/javascript">

//체크된 상태 유지시키키

document.getElementById("ck1").checked=true;

</script>

<%

//쿠키에 담기

Cookie cook=new Cookie("pop","no");

cook.setMaxAge(60*60*24);//유지시간 24시간 설정

response.addCookie(cook);

}

%>

</body>

</html>