HTTP 프로토콜은 stateless 프로토콜
특정 사용자에 대한 상태 정보를 저장해야 할 경우 문제가 대두
세션이란, 여러 HTTP 요청들 간에 특정 클라이언트 정보를 저장-유지하는 메커니즘
웹 컨테이너 벤더는 세션 유지와 관련된 지원을 반든시 제공
세션 정보(객체)는 요청 객체로부터 획득 가능
- ex) HttpSession session = request.getSession();
세션 객체는 여러 개의 특정 정보를 저장, 검색할 수 있는 메소드를 제공
- ex) session.setAttribute("myCart", cart);
HttpSession getSession();
HttpSession getSession(boolean flag);
void invalidate();
void invalidate(); // 서블릿
<session-config> // web.xml
<session-timeout>30<session-timeout>
</session-config>
세션을 지원하기 위해 고안된 일종의 문자 데이터
요청에 대한 응답 과정에서 클라이언트 장치(예: 브라우저)에 저장할 수 있는 정보
클라이언트의 브라우저 종료 시 쿠키 정보는 기본적으로 삭제됨
서버와 클라이언트는 요청-응답 과정에서 쿠키(이름/값)를 교환
쿠키 이름은 아스키 코드의 알파벳과 숫자만을 포함
콤마, 세미콜론, 공백 포함 불가
$로 시작 불가능
setMaxAge(60 * 30)
URLEncoder.encode("서울","UTF-8");
/ Java /
@WebServlet("/mod010/mypage")
public class MyPageServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private UserService userService;
public void init() {
userService = new UserService();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HttpSession session = request.getSession(false); // true로 설정되면 session을 새로 만듬, 새로 만들면 사용자를 알 수 없게 됨
String userId = (String) session.getAttribute("userId");
if (userId == null) {
request.getRequestDispatcher("login.jsp").forward(request, response);
return;
}
Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies) {
System.out.println(cookie.getName() + " : " + cookie.getValue());
if (cookie.getName().equals("lastAccessTime")) {
request.setAttribute("lastAccessTime", URLDecoder.decode(cookie.getValue(), "UTF-8"));
}
}
response.addCookie(lastAccessTime());
request.getRequestDispatcher("mypage.jsp").forward(request, response);
}
private Cookie lastAccessTime() {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateStr = format.format(new Date());
format.format(new Date());
Cookie cookie = null;
try {
cookie = new Cookie("lastAccessTime", URLEncoder.encode(dateStr, "UTF-8"));
} catch (Exception e) {
e.printStackTrace();
}
cookie.setMaxAge(60 * 60 * 24 * 30);
cookie.setPath("/"); // '/' 를 사용하면 어떤 사이트라도 쿠키를 전부 심는다는 의미
return cookie;
}
}
JSP
<label>Last Access Time : </label> ${lastAccessTime}