실습
login.html
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
사이트에 방문해 주셔서 감사합니다. <br/>
로그인 하십시오. <br/>
<form action="loginCK.jsp" method="post">
아 이 디 : <input type="text" name="id" size="10"><br/>
비밀번호 : <input type="password" name="pw" size="10"><br/>
<input type="submit" value="login">
</form>
</body>
</html>
loginCK.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, pw;
id = request.getParameter("id");
pw = request.getParameter("pw");
if ((id.equals("abcde")) && (pw.equals("12345"))) { // 원래 DB연동으로 인증해야한다
Cookie ck = new Cookie("id", id);
ck.setMaxAge(60);
response.addCookie(ck);
response.sendRedirect("welcome.jsp");
} else {
response.sendRedirect("login.html");
}
%>
</body>
</html>
welcome.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>
<%
Cookie[] cookies = request.getCookies(); // 이거 왜 배열로 받지? 그리고 배열로 받는 것이라면 .add로 해야지 않나?
for (int i = 0; i < cookies.length; i++) {
String id = cookies[i].getValue();
if(id.equals("abcde"))out.println(id + "님 안녕하세요" + "<br/>");
}
%>
<a href = "logout.jsp">이곳을 클릭하시면 logout 페이지로 이동합니다</a>
</body>
</html>
logout.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>
로그아웃 되셨습니다.<br/>
<%
Cookie[] ck = request.getCookies();
if (ck != null) {
for (int i = 0; i < ck.length; i++) {
if (ck[i].getValue().equals("abcde")) {
ck[i].setMaxAge(0);
response.addCookie(ck[i]);
}
}
}
%>
<a href="logouttest.jsp">로그아웃 테스트 페이지로 이동</a>
</body>
</html>
logouttest.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>
쿠키가 제대로 삭제되었는지 체크해보는 페이지입니다.<br />
쿠키가 제대로 삭제되었다면 밑에 무엇인가가 print가 되면 안됩니다.<br/>
<%
Cookie[] ck = request.getCookies();
if (ck != null) {
for (int i = 0; i < ck.length; i++) {
ck[i].getValue().toString();
out.print("<br/>");
}
}
%>
</body>
</html>
------------------------------------------------------------------------------------------------------------------------------
+ 수업내용 추가
쿠키의 생성과 add, read
<%
//쿠키 객체 생성
Cookie mycookie = new Cookie("cname","1007");
//접속한 클라이언트에게 (브라우져에게 전달)
response.addCookie(mycookie);
%>
서버 설정한 쿠키 이름 : <%= mycookie.getName() %><br>
서버 설정한 값 : <%= mycookie.getValue() %><br>
서버 설정한 쿠키 소멸설정 :(-1 소멸시간이 없다) <%= mycookie.getMaxAge() %><br>
<hr>
<!-- 서버가 클라이언트에게 Response 한 cookie 객체 얻어오기 -->
<%
Cookie[] cs= request.getCookies(); // <- 여기서 유의해야 할 것은 response가
// request보다 늦게 실행 된다는 점이다
// 따라서 에러가 발생한다
if(cs != null || cs.length > 0){
for(Cookie c : cs){
out.print(c.getName() + "<br>");
out.print(c.getValue() + "<br>");
out.print(c.getMaxAge()+ "<br>");
}
}
%>
</body>
</html>
쿠키의 종류
<body>
/*
1.메모리 쿠키(브라우져 쿠키) : Client 강제로 지우지 않는 한 유지
(브라우져를 닫기 전까지)
: 소멸 타입은 -1이고
session 소멸 되면 같이 없어진다
2.파일 쿠키(소멸 시간을 가지고 있다) : Client 강제로 지우지 않는 한 유지(set시간까지)
ex ) setMaxage(60) 60초
ex ) 30일 (30*24*60*60) 일*시*분*초
*/
<%
Cookie co = new Cookie("bit","kim");
co.setMaxAge(60);
response.addCookie(co);
%>
</body>
</html>
수업시간에 한 예제
<%@ 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>
<%
/* 쿠키값이 존재하면 UID input 태그 value 속성에 그 값을 출력 */
String userid="";
Cookie[] cookies = request.getCookies();
if(cookies == null){
response.sendRedirect("Ex20_login.jsp");//<- 무한 재귀가 되지 않는 이유는
// 첫 read때 생긴 쿠키 객체 때문이 아니라
// 원래 sendRedirect()가 그렇다고 하셨음
// 쿠키세션 의견도 그렇게 봐도 된다고도
// 말씀하시기도 하셨음
}else{
for(int i = 0 ; i < cookies.length ; i++){
if(cookies[i].getName().equals("UID")){
userid = cookies[i].getValue();
}
}
}
%>
<script type="text/javascript">
/* 아래 코드는 자바스크립트 변수에 server 코드 할당하기 */
var data = '<%=userid%>';
console.log(data + "님");
</script>
<body>
<form action="Ex20_loginok.jsp" method="get">
ID:<input type="text" name="UID" value="<%=userid%>"><br>
PWD:<input type="password" name="PWD">
<hr>
ID값 유지하기 <input type="checkbox" name="chk">
<hr>
<input type="submit" value="로그인">
<input type="reset" value="취소">
</form>
</body>
</html>
<%@ 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>
<!--
ID , PWD , chk 값 받아서
1. ID , PWD 같다면 로그인 성공 (if(ID.equals("PWD") ...
chk값이 체크 되어 있다면
>쿠키 생성 ID값을 쿠키에 담아서 : 유효 타입(24시간)
>쿠키 쓰기 완료
2. ID , PWD 같다면 로그인 성공
chk값이 체크 되어 있지 않다면
>기본 만들었던 쿠키 삭제 setMaxAge(0)
3. ID , PWD 같지 않다면
response.sendRedirect() > Ex20_login.jsp 페이지
-->
<%
String id = request.getParameter("UID");
String pwd = request.getParameter("PWD");
String chk = null;
chk = request.getParameter("chk");
out.print(id + " / " + pwd + " / " + chk);
%>
<%
if(id.equals(pwd)){ //로그인 성공
if(chk != null){
if(chk.equals("on")){ //쿠키 생성
//쿠키 생성
Cookie co = new Cookie("UID",id);
co.setMaxAge(24*60*60);
response.addCookie(co);
}
}else{
//쿠키 삭제
Cookie delco = new Cookie("UID","");
delco.setMaxAge(0); //소멸
response.addCookie(delco);
}
response.sendRedirect("Ex20_login.jsp"); //페이지 이동 (loing.jsp) 요청
}else{
//response.sendRedirect("Ex20_login.jsp");
out.print("<script>location.href='Ex20_login.jsp'</script>");
}
%>
</body>
</html>
세션아이디 쿠키, 쿠키의 생성 범위, 쿠키의 수정
세션아이디 쿠키
어느 페이지든 접속하게 되면 세션아이디가 담긴 쿠키가 생성된다. 이것은 브라우저를 완전히 닫지 않는 이상 계속 살아있고 브라우저가 종료되면(탭 닫기 말고 모두 끄는 것) 세션아이디가 담긴 쿠키는 없어진다. 다시 켜서 확인을 해보면 세션 아이디가 달라져 있음을 확인할 수 있다.
cf) 이 세션 아이디는 쿠키 형태로 클라이언트가 갖게 되고 서버는 session 객체를 지니게 된다
세션의 범위
브라우저 단위로 작동된다. 가령 한 페이지에서 24시간 가는 A쿠키를 만들게 설정되어 있고 이를 크롬, 익스플로러 두 개로 들어갔을때 내 컴퓨터에 A쿠키는 두 개 있게 된다. 브라우저 단위라는 것을 명심.
쿠키의 수정
.setMaxAge() 와 같이 쿠키 값을 수정하게 되면 반드시 이를 다시 .addCookie() 해주어야 한다. 혹은 새로운 쿠키를 만들어 덮어 씌워야 한다. 쿠키는 Map으로 관리되므로 쿠키 name을 똑같이 만들어 .addCookie()하면 쿠키가 바뀌게 된다. 바꾸면 .addCookie()를 해야하고 Map 형식이라는 것 이 두 가지가 핵심이다.