🔷 비연결(connectionless) 지향형 통신 프로토콜
🔷 응답 후 연결을 종료! (stateless)
❗ 이러한 문제 해결을 위해서 Cookie와 HttpSession을 활용한다.
javax.servlet.http.Cookie
🔷 서버가 생성하는 클라이언트 정보를 가지고 있는 파일
🔷 Cookie 동작 순서
1) Client가 요청 생성
2) WAS
는 Cookie를 생성하고 Http Header에 Cookie를 넣어 응답
3) Client(Browser)는 Cookie를 저장, 해당 서버에 요청할 때 요청과 함께 Cookie를 전송
4) Cookie는 브라우저가 종료되더라도 계속 저장되기 때문에(만료기간 전까지) 동일 사이트 재 방문하여 요청 시 필요에 따라 Cookie가 재 전송된다.
🔷 Cookie 특징
🔷 Cookie 생성 및 추가
🖥 쿠키 생성
Cookie cookie = new Cookie("userid", "Bzeromo");
🖥 쿠키 응답에 추가
response.addCookie(cookie);
🔷 Cookie 주요 메서드
메서드 | 설명 |
---|---|
void setComment(String comment) | 쿠키에 대한 설명 설정 |
void setDomain(String domain) | 쿠키의 유효한 도메인 설정 |
void setMaxAge(int expiry) | 쿠키 유효기간 설정 |
void setPath(String path) | 쿠키 유효 디렉토리 설정 |
void setValue(String value) | 쿠키 값 설정 |
String getComment() | 쿠키 설명 반환 |
String getDomain() | 쿠키 유효 도메인 반환 |
int getMaxAge() | 쿠키 유효기간 반환 |
String getPath() | 쿠키 유효 디렉토리 반환 |
String getValue | 쿠키 값 반환 |
🖥 쿠키 실습
package com.ssafy.makecookie;
import java.io.IOException;
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;
@WebServlet("/make")
public class MakeCookieServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public MakeCookieServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String key = request.getParameter("key");
String value = request.getParameter("value");
Cookie cookie = new Cookie(key, value);
cookie.setMaxAge(10); // 초단위
response.addCookie(cookie);
response.sendRedirect("01_cookie.jsp");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
🍪 하나를 구워보자.
쿠키가 잘 들어와있다. 그리고 10초가 지나면...
사라진다!
javax.servlet.http.HttpSession
🔷 사용자가 웹 서버에 접속해 있는 상태를 하나의 단위보고 세션이라고 한다.
sessionid
를 이용해 구분한다.WAS
의 메모리에 객체 형태로 저장🔷 Session 동작 순서
1) 클라이언트가 페이지를 요청
2) 서버는 쿠키에 session id
가 있는지 확인한다.
3) session id
가 존재하지 않으면 session id
를 생성해 쿠키에 쓴 다음 클라이언트로 반환
4) 생성된 session id
를 이용하여 서버 내 메모리를 생성
5) 클라이언트가 다음 요청 시 쿠키에 session id(JSESSIONID)
를 포함해 전달하면 서버 내에 저장된 session id
와 비교하여 데이터를 조회
🔷 session 설정
JSESSIONID
를 할당 받는다.🔷 session 사용하기
HttpSession session = request.getSession();
session.setAttribute("userid", "Bzeromo");
❗ 서블릿에서 session을 인스턴스명으로 사용하려하면 에러가 뜬다. 예약어이기 때문.
따라서 바로session
.메서드 로 이용하거나 인스턴스명을 다른 이름으로 하는 것이 맞다.
String userid = (String)session.getAttribute("userid");
🔷 Session 주요 메서드
메서드 | 설명 |
---|---|
void setAttribute(String name, Object value | session에 지정한 name에 해당하는 객체를 추가 |
void setMaxInactiveInterval(int interval) | 사용자가 다음 요청을 보낼 때까지 세션을 유지하는 최대시간(초단위)을 설정 |
void invalidate() | 현재 세션을 없애고 속성도 삭제 |
String getId() | 현제 세션의 고유 id를 반환 |
long getLastAccessTime() | 현재 세션에 클라이언트가 마지막으로 요청을 보낸 시간을 반환(long) |
Object getAttribute(String name) | name에 해당하는 속성값 반환, 반환형이 Object 임에 유의 |
long getCreationTime() | 세션이 만들어진 시간 반환 |
void removeAttribute(String name) | 세션에서 지정한 이름의 객체를 제거 |
Enumeration getAttributeNames() | 세션에서 모든 객체의 이름을 Enumeration형으로 반환 |
🖥 세션 실습
<%@ 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>
<h3>세션 정보를 얻어오는 메소드를 사용하기</h3>
<%
String id_str = session.getId();
long lasttime = session.getLastAccessedTime();
long createdtime = session.getCreationTime();
long time_used = (lasttime - createdtime) / 60000;
int inactive = session.getMaxInactiveInterval() / 60;
boolean b_new = session.isNew();
%>
[1] 세션 ID는 [
<%=session.getId()%>] 입니다.
<br>
<hr>
[2] 당신이 웹 사이트에 머문 시간은
<%=time_used%>
분입니다.
<br>
<hr>
[3] 세션의 유효 시간은
<%=inactive%>
분입니다.
<br>
<hr>
[4] 세션이 새로 만들어졌나요?
<br>
<%
if (b_new)
out.print(" 예! 새로운 세션을 만들었습니다.");
else
out.print(" 아니오! 새로운 세션을 만들지 않았습니다.");
%>
</body>
</html>
로그인&로그아웃 기능에 매우 유용할듯하다.