쿠키 (Cookie) | 세션 (HttpSession) |
클라이언트 쪽에 저장 (웹브라우저에 저장) |
서버에 저장 |
문자열만 저장 | 객체, 문자, 숫자 등 원하는 자료형으로 저장 가능 |
세션(HttpSession)
JSP에는 Session객체가 이미 'session'이라는 이름으로 저장되어 있다
- 아이디
세션을 구분하기 위한 고유한 값
session객체.getId(); - 생성 시간
1970년 1월 1일부터 경과한 시간 (ms단위)
session객체.getCreationTime(); - 가장 최근에 세선에 접근한 시간
1970년 1월 1일부터 경과한 시간 (ms단위)
session객체.getLastAccessedTime(); - 세션 유효시간
가장 최근에 접근한 시간부터 이 '유효시간'이 경과할 때까지
세션이 유지된다. (단위 : 초) [기본값은 30분]
session객체.getMaxInactiveInterval();
저장
- Session객체를 생성하거나 현재 Session 가져오기
- Request객체.getSession(); 또는 Request객체.getSession(true);
==> 현재 Session이 존재하면 현재 Session을 반환하고,
존재하지 않으면 새로운 Session을 생성하여 반환한다. - Request객체.getSession(false);
==> 현재 Session이 존재하면 현재 Session을 반환하고,
존재하지 않으면 새로운 Session을 생성하지 않고 null을 반환한다
- Request객체.getSession(); 또는 Request객체.getSession(true);
- Session에 데이터를 저장하기
Session객체.setAttribute("key값", 데이터(session값));
==> 'key값'은 문자열, '데이터'는 자바의 모든 자료형
읽기
- Session 객체를 생성하거나 현재 Session을 가져오기
HttpSession session = request.getSession(); - Session 데이터 읽기
- 단일 데이터 읽기
Session객체.getAttribute("key값");
==> Object타입이기 때문에 반드시 형변환 필요 - 모든 데이터 읽기
---------------------------------------------------------------------------------
Enumeration<String> Enumer객체 = Session객체.getAttributeNames();
while( Enumer객체.hasMoreElements()) {
String key = Enumer객체.nextElement();
}
----------------------------------------------------------------------------------
- 키값들을 집합체 형태로 관리
Enumeration<E> - key값을 가져옴
request객체.getAttributeNames() - 다음 집합체가 존재하는지 확인
Enumer객체.hasMoreElements() - 집합체 값 가져오기
Enumer객체.nextElement();
- 키값들을 집합체 형태로 관리
- 단일 데이터 읽기
삭제
- Session 객체를 생성하거나 현재 Session을 가져오기
HttpSession session = request.getSession(); - Session 정보 삭제하기
- 개별적인 Session데이터 삭제
Session.removeAttribute("key값");
==> Session자체는 삭제되지 않고 개별적인 Session데이터만 삭제된다. - Session자체를 삭제한다
Session객체.invalidate();
==> Session자체가 삭제된다.
- 개별적인 Session데이터 삭제
예시
JSP
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Session 연습</title>
</head>
<body>
<%
// JSP문서에는 'session'이라는 이름으로 Session객체가 이미 저장되어 있다.
// 즉, 세션 관련 작업을 할 때는 바로 'session'을 사용하면 된다
%>
<a href="<%=request.getContextPath() %>/sessionAdd.do">Session 정보 저장하기</a><br><br>
<a href="<%=request.getContextPath() %>/sessionRead.do">Session 정보 읽어오기</a><br><br>
<a href="<%=request.getContextPath() %>/sessionDelete.do">Session 정보 삭제하기</a><br><br>
</body>
</html>
저장
package kr.or.ddit.session;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
//Session 정보를 저장하는 서블릿
@WebServlet("/sessionAdd.do")
public class SessionAdd extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setCharacterEncoding("utf-8");
response.setContentType("text/html; charset=utf-8");
PrintWriter out = response.getWriter();
request.setCharacterEncoding("utf-8");
// Session 정보를 저장하는 방법
// 1. Session객체를 생성하거나 현재 Session 가져오기
// 형식1) Request객체.getSession(); 또는 Request객체.getSession(true);
// ==> 현재 Session이 존재하면 현재 Session을 반환하고, 존재하지 않으면 새로운 Session을 생성하여 반환한다.
// 형식2) Request객체.getSession(false);
// ==> 현재 Session이 존재하면 현재 Session을 반환하고, 존재하지 않으면 새로운 Session을 생성하지 않고 null을 반환한다
HttpSession session = request.getSession();
// 2. Session에 데이터를 저장하기
// 형식) Session객체.setAttribute("key값", 데이터(session값))
// ==> 'key값'은 문자열, '데이터'는 자바의 모든 자료형
session.setAttribute("testSession", "연습용 세션입니다");
session.setAttribute("userName", "오리");
session.setAttribute("age", 20);
out.println("<html> <head><meta charset='utf-8'><title>Session 저장 연습</title></head>");
out.println("<body>");
out.println("<h3>Session 데이터가 저장되었습니다</h3><br><br>");
out.println("<a href='"+request.getContextPath()+"/session/sessionTest.jsp'>시작문서로 이동</a>");
out.println("</body></html>");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
읽기
package kr.or.ddit.session;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
//Session 정보를 읽어오는 서블릿
@WebServlet("/sessionRead.do")
public class SessionRead extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setCharacterEncoding("utf-8");
response.setContentType("text/html; charset=utf-8");
PrintWriter out = response.getWriter();
request.setCharacterEncoding("utf-8");
// Session 정보 읽어오기
// 1. Session 객체를 생성하거나 현재 Session을 가져오기
HttpSession session = request.getSession();
out.println("<html> <head><meta charset='utf-8'><title>Session 읽기 연습</title></head>");
out.println("<body>");
out.println("<h3>저장된 Session 데이터 확인하기</h3><br><br>");
out.println("<h4>Session 데이터 1개 확인하기</h4>");
// 2. Session 데이터 읽기
// 형식) Session객체.getAttribute("key값");
String sessionValue = (String) session.getAttribute("testSession");
if(sessionValue==null) {
out.println("<h5>testSession의 세션값은 없습니다</h5>");
} else {
out.println("<h5>testSession의 세션 값 : "+sessionValue+"</h5>");
}
out.println("<br><hr><br>");
out.println("<h4>전체 Session 데이터 확인하기</h4>");
// Session에 등록된 모든 key값들 가져오기
Enumeration<String> sessionKeys = session.getAttributeNames();
int cnt =0;
while(sessionKeys.hasMoreElements()) {
cnt++;
String key = sessionKeys.nextElement();
out.println("<li>"+key+" : "+session.getAttribute(key)+"</li>");
}
if(cnt==0) out.println("<li>저장된 Session데이터가 없습니다</li>");
out.println("<ol>");
out.println("</ol>");
out.println("<a href='"+request.getContextPath()+"/session/sessionTest.jsp'>시작문서로 이동</a>");
out.println("</body></html>");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
삭제
package kr.or.ddit.session;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
//Session 정보를 삭제하는 서블릿
@WebServlet("/sessionDelete.do")
public class SessionDelete extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setCharacterEncoding("utf-8");
response.setContentType("text/html; charset=utf-8");
PrintWriter out = response.getWriter();
request.setCharacterEncoding("utf-8");
// Session 정보 삭제하기
// 1. Session객체 생성하거나 현재 세션 정보 가져오기
HttpSession session = request.getSession();
// 2. Session 정보 삭제하기
// 방법1) 개별적인 Session데이터 삭제하기
// 형식) Session.removeAttribute("key값");
// ==> Session자체는 삭제되지 않고 개별적인 Session데이터만 삭제된다.
session.removeAttribute("testSession");
// 방법2) Session자체를 삭제한다
// 형식) Session객체.invalidate();
// ==> Session자체가 삭제된다.
session.invalidate();
out.println("<html> <head><meta charset='utf-8'><title>Session 삭제 연습</title></head>");
out.println("<body>");
out.println("<h3>Session 데이터가 삭제되었습니다</h3><br><br>");
out.println("<a href='"+request.getContextPath()+"/session/sessionTest.jsp'>시작문서로 이동</a>");
out.println("</body></html>");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
문제
- sessionLogin.jsp
session을 확인하여 로그인 관련 session정보가 있으면 '***님 반갑습니다.'라는
환영 메시지가 출력되고, session정보가 없으면 로그인 Form이 출력되도록 한다.
(참고, JSP문서에서는 HttpSession객체가 자동으로 생성되어 session이라는 변수에 저장되어 있다.)
- 로그인 처리 서블릿 (sessionLogin.do)
로그인 Form에서 ID와 Password를 받아서 ID가 'admin'이고 Password가 '1234'이면
로그인 성공으로 처리 즉, session에 로그인 정보 저장하고 sessionLogin.jsp로 이동한다.
로그인에 실패하면 아무 처리 없이 sessionLogin.jsp로 이동한다.
- 로그아웃 처리 서블릿(sessionLogout.do)
session정보를 삭제하고 sessionLogin.jsp로 이동한다.
JSP
<%@ 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>
<%
String id = (String) session.getAttribute("id");
if(id==null){
%>
<form action="<%=request.getContextPath()%>/sessionLogin.do" method="post">
<table border="1" style="margin : 1px auto">
<tr>
<td>ID : </td>
<td><input name="id" placeholder="아이디를 입력하세요"></td>
</tr>
<tr>
<td>PASSWORD : </td>
<td><input name="pw" type="password" placeholder="비밀번호를 입력하세요"></td>
</tr>
<tr>
<td colspan="2" style="text-align : center"><input type="submit" value="Login"></td>
</tr>
</table>
</form>
<%
} else{
%>
<div style="text-align : center">
<h3><%=id %>님 반갑습니다</h3>
<br>
<a href="<%=request.getContextPath()%>/sessionLogout.do">로그아웃</a>
</div>
<%
}
%>
</body>
</html>
Login서블릿
package kr.or.ddit.session;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebServlet("/sessionLogin.do")
public class SessionLogin extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String id = request.getParameter("id");
String pw = request.getParameter("pw");
if(id.equals("admin")&&pw.equals("1234")) {
HttpSession session = request.getSession();
session.setAttribute("id", id);
}
response.sendRedirect(request.getContextPath()+"/session/sessionLogin.jsp");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
Logout서블릿
package kr.or.ddit.session;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebServlet("/sessionLogout.do")
public class SessionLogout extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
session.invalidate();
response.sendRedirect(request.getContextPath()+"/session/sessionLogin.jsp");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
'JAVA > HIGH JAVA' 카테고리의 다른 글
[JAVA] Json(ajax) + 동기방식 (0) | 2024.06.04 |
---|---|
6/3 Homework - DB로 로그인, log4j 사용 (0) | 2024.06.03 |
5/31 Homework - 로그인(쿠키로 id기억) (0) | 2024.05.31 |
[JAVA] 쿠키(Cookie) (0) | 2024.05.30 |
[JAVA] UseCase (0) | 2024.05.30 |