뉴렉처 학습(서블릿/JSP) 31강 ~ 33강
#31강 Cookie의 maxAge 옵션
- 쿠키에 maxAge를 설정하지 않으면, 쿠키는 브라우저의 생존 주기와 같아진다.
- 기본적으로 쿠키는 브라우저 메모리에 존재하다가 기간 설정 or maxAge 설정을 하게 되면 해당 브라우저와 상관없이 기간 내에 존재해야 하기 때문에 외부 파일에 저장된다.
valueCookie.setMaxAge(초); // setMaxAge 지정 60은 1분 24*60*60 은 1일
package com.newlecture.web;
import java.io.IOException;
import javax.servlet.ServletContext;
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;
import javax.servlet.http.HttpSession;
@WebServlet("/calc2")
public class Calc2 extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 어플리케이션 저장소 : ServletContext
ServletContext application = request.getServletContext();
HttpSession session = request.getSession();
Cookie[] cookies = request.getCookies(); // 쿠키를 읽을 때 request 사용
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
String v_ = request.getParameter("v");
String op = request.getParameter("operator");
int v = 0;
if (!v_.equals(""))
v = Integer.parseInt(v_);
// 계산을 위한 조건 설정
if (op.equals("=")) {
// x = 담은 값을 가져와 x에 저장(꺼내서 사용)
// int x = (Integer)application.getAttribute("value");
// int x = (Integer)session.getAttribute("value");
int x = 0;
for (Cookie c : cookies) {
if (c.getName().equals("value")) {
x = Integer.parseInt(c.getValue());
break;
}
}
int y = v;
// operator = 담은 값을 가져와 operator에 저장(꺼내서 사용)
// String operator = (String)application.getAttribute("op");
// String operator = (String) session.getAttribute("op");
String operator = "";
for (Cookie c : cookies) {
if (c.getName().equals("op")) {
operator = c.getValue();
break;
}
}
int result = 0;
if (operator.equals("+")) {
result = x + y;
} else {
result = x - y;
}
response.getWriter().printf("result is %d\n", result);
}
// 저장을 위한 조건 설정
// 오퍼레이터 입력이 덧셈 또는 뺄셈인 경우, 그냥 값 저장만 진행
else {
// application.setAttribute("value", v);
// application.setAttribute("op", op);
// session.setAttribute("value", v);
// session.setAttribute("op", op);
Cookie valueCookie = new Cookie("value", String.valueOf(v));
Cookie opCookie = new Cookie("op", op);
//valueCookie.setPath("/"); // 모든 경로
//opCookie.setPath("/"); // 모든 경로
//valueCookie.setPath("/add"); // add라는 url 요청 시
//opCookie.setPath("/add"); // add라는 url 요청 시
valueCookie.setPath("/calc2"); // calc2라는 url 요청 시
opCookie.setPath("/calc2"); // calc2라는 url 요청 시
valueCookie.setMaxAge(24*60*60); // 만료날짜 지정 (초단위로 지정, 60은 1분)
response.addCookie(valueCookie);
response.addCookie(opCookie);
}
}
}
#32강 Application/Session/Cookie 정리
*Application
- 사용범위 : 전역 범위에서 사용하는 저장 공간
- 생명주기 : WAS(Web Application Server)가 시작해서 종료할 때 까지
- 저장위치 : WAS 서버의 메모리
*Session
- 사용범위 : 세션 범위에서 사용하는 저장 공간 (특정 사용자만)
- 생명주기 : 세션이 시작해서 종료할 때 까지
- 저장위치 : WAS 서버의 메모리
*Cookie
- 사용범위 : Web Browser별 지정한 path범주 공간 (서버 자원을 빌리지 않아 서버에 부담을 주지 않는다.)
(path를 통해 특정 url만 데이터 사용 가능하도록 지정 가능)
- 생명주기 : Browser에 전달한 시간부터 만료시간까지 (만료시간 설정으로 서버 생명주기에 상관없이 클라이언트가 데이터를 가질 수 있다.)
- 저장위치 : Web Browser의 메모리 또는 파일
- 장기간 값을 보관(1년) 하기 위해선 쿠키 사용.
- 특정 url만 사용 가능하도록 하기 위해선 쿠키 사용.
#33강 서버에서 페이지 전환해주기(redirection)
- 기존에 값을 입력하여 연산 진행 시 첫 번째 값 입력 후 사칙연산(더하기 or 빼기) 입력 시 값이 post 되면서 서블릿으로부터 백지를 돌려받고, 뒤로 가기 누른 후 두 번째 값 입력 후 =을 클릭하여 결과를 얻어왔다.
- 페이지 전환을 사용하게 되면 서블릿이 백지상태를 돌려주지 않고 경로를 우회 결과를 전달받게 된다.
package com.newlecture.web;
import java.io.IOException;
import javax.servlet.ServletContext;
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;
import javax.servlet.http.HttpSession;
@WebServlet("/calc2")
public class Calc2 extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 어플리케이션 저장소 : ServletContext
ServletContext application = request.getServletContext();
HttpSession session = request.getSession();
Cookie[] cookies = request.getCookies(); // 쿠키를 읽을 때 request 사용
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
String v_ = request.getParameter("v");
String op = request.getParameter("operator");
int v = 0;
if (!v_.equals(""))
v = Integer.parseInt(v_);
// 계산을 위한 조건 설정
if (op.equals("=")) {
// x = 담은 값을 가져와 x에 저장(꺼내서 사용)
// int x = (Integer)application.getAttribute("value");
// int x = (Integer)session.getAttribute("value");
int x = 0;
for (Cookie c : cookies) {
if (c.getName().equals("value")) {
x = Integer.parseInt(c.getValue());
break;
}
}
int y = v;
// operator = 담은 값을 가져와 operator에 저장(꺼내서 사용)
// String operator = (String)application.getAttribute("op");
// String operator = (String) session.getAttribute("op");
String operator = "";
for (Cookie c : cookies) {
if (c.getName().equals("op")) {
operator = c.getValue();
break;
}
}
int result = 0;
if (operator.equals("+")) {
result = x + y;
} else {
result = x - y;
}
response.getWriter().printf("result is %d\n", result);
}
// 저장을 위한 조건 설정
// 오퍼레이터 입력이 덧셈 또는 뺄셈인 경우, 그냥 값 저장만 진행
else {
// application.setAttribute("value", v);
// application.setAttribute("op", op);
// session.setAttribute("value", v);
// session.setAttribute("op", op);
Cookie valueCookie = new Cookie("value", String.valueOf(v));
Cookie opCookie = new Cookie("op", op);
//valueCookie.setPath("/"); // 모든 경로
//opCookie.setPath("/"); // 모든 경로
//valueCookie.setPath("/add"); // add라는 url 요청 시
//opCookie.setPath("/add"); // add라는 url 요청 시
valueCookie.setPath("/calc2"); // calc2라는 url 요청 시
opCookie.setPath("/calc2"); // calc2라는 url 요청 시
valueCookie.setMaxAge(24*60*60); // 만료날짜 지정 (초단위로 지정, 60은 1분)
response.addCookie(valueCookie);
response.addCookie(opCookie);
response.sendRedirect("calc2.html"); // redirect 사용 경로 우회
}
}
}