사용자 요청 라이프 사이클
💡 사용자의 요청이 일어났을 때 하나의 라이프 사이클을 보면웹서버와 브라우저는 애플리케이션을 사용하는 동안 필요한 값을 쿠키를 통해 공유하여 상태를 유지한다.
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class T05_ServletCookieTest extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
setCookieExam(req,resp); //쿠키 생성 예제
}
private void setCookieExam(HttpServletRequest req, HttpServletResponse resp) throws IOException {
/* 쿠키정보 설정하는 방법
1. 쿠키 객체를 생성한다. 사용불가문자(공백, [] () =, " / ? @ : ; )
Cookie cookie = new Cookie("키값", "value값");
쿠키값은 사용불가문자를 제외한 나머지 출력가능한 아스키문자 사용 가능
=> 이외의 값 (예를들면 한글)을 사용시에는 URLEncoding.encode() 사용하여 인코딩 처리를 해야한다.
2. 쿠키 최대 지속시간을 설정한다(초단위)
=> 지정하지 않으면 웹브라우저를 종료할 때 쿠키를 함께 삭제한다.
cookie.setMaxAge(60 * 60 ^ 24); // 24시간
3. 응답헤더에 쿠키 객체를 추가한다.
resp.addCookie(cookie);
=> 출력버퍼가 플러시 된 이후에는 쿠키를 추가할 수 없다
(응답 헤더를 통해서 웹브라우저에 전달하기 때문에)
*/
req.setCharacterEncoding("UTF-8");
// 쿠키 생성하기
Cookie userId = new Cookie("userId",req.getParameter("userId"));
// 쿠키값에 한글을 사용시 인코딩 처리를 해준다
Cookie name = new Cookie("name",URLEncoder.encode(req.getParameter("name"),"UTF-8"));
// 쿠키 소멸시간 설정 (초단위)
userId.setMaxAge(60*60*24); //1일
userId.setHttpOnly(true); // javascript를이용한 직접접근 방지
name.setMaxAge(60*60*48); //2일
//응답 헤더에 쿠키 추가하기
resp.addCookie(userId);
resp.addCookie(name);
// 응답헤더에 인코딩 및 Content-Type 설정
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
String title ="쿠키설정예제";
out.println("<!doctype html><html><head><title>"+title+"</title>"
+"</head><body>"+"<h1 align=\"center\">"+title+"</h1>"
+"<ul>"
+"<li><b>ID</b>:"+req.getParameter("userId")+"</li>"
+"<li><b>이름</b>:"+req.getParameter("name")+"</li>"
+"</ul></body></html>");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
<servlet>
<servlet-name>T05_SCT</servlet-name>
<servlet-class>kr.or.ddit.basic.T05_ServletCookieTest</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>T05_SCT</servlet-name>
<url-pattern>/T05_SCT</url-pattern>
</servlet-mapping>
url인코더로 인코딩해서 퍼센트인코딩
public class T05_ServletCookieTest extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//setCookieExam(req,resp); // 쿠키 생성 예제
readCookieExample(req,resp); // 쿠키 정보 읽기 예제
}
private void readCookieExample(HttpServletRequest req, HttpServletResponse resp) throws IOException {
// 현재 도메인에서 사용중인 쿠키정보 배열 가져오기
Cookie[] cookies = **req.getCookies();**
// 응답헤더에 인코딩 및 content type 설정
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
String title = "쿠키정보읽기예제";
out.println("<!doctype html><html><head><title>"+title+"</title></head><body>");
if(cookies != null) {
out.println("<h2>"+title+"</h2>");
for(Cookie cookie : cookies) {
out.print("name : "+cookie.getName()+"</br>");
out.print("value : "+URLDecoder.decode(cookie.getValue(),"UTF-8")+"</br>");
out.print("<hr>");
}
}else {
out.println("<h2>쿠키정보가 없습니다.</h2>");
}
out.println("</body");
out.println("</html>");
}
}
위에서 쿠키를 넣어뒀으므로 이렇게 뜨는것
< 사용중인 쿠키정보를삭제하는 방법 >
뭔가 잘못 받아쓴ㄷ긋...