위로
아래
세션
// session 생성
HttpSession session = request.getSession();
// session 설정
session.setAttribute("key",value);
// session 불러오기
session.getAttribute("key");
- 쿠키와 달리 클라이언트의 PC가 아니라 서버의 메모리에 생성되어 정보를 저장. 보안성이 좋다.
- 클라이언트가 웹 브라우저를 통해 서버에 접속한 후, 용무를 처리하고, 웹 브라우저를 닫아 서버와 접속을 종료하는 하나의 단위
- 클라이언트가 서버에 접속해있는 동안 그 상태를 유지하는 것이 목적 (다른 페이지에 가도 로그인이 끊기지 않는 것은 세션 때문)
- 오직 웹 서버에 존재하는 객체.
- 브라우저마다 하나씩 존재 (다른 브라우저 쓰면 세션 다시 생성)
- 로그인은 쿠키보다는 세션을 이용해서 만드는 게 좋다
쿠키 | 세션 | |
저장 위치 / 형식 | 클라이언트 PC에 text로 저장 | 웹 서버에 Object 타입으로 저장 |
보안 | 클라이언트에 저장되므로 보안에 취약 | 서버에 저장되므로 보안에 안전 |
자원 / 속도 | 서버 자원을 사용하지 않으므로 세션보다 빠름 | 서버 자원을 사용하므로 쿠키보다 느림 |
용량 | 용량의 제한이 있음 | 서버가 허용하는 한 제한 X |
유지 시간 | 쿠키 생성 시 설정. 설정 시간이 경과되면 무조건 삭제 | 서버의 web.xml에서 설정. 설정된 시간 내라도 동작이 있다면 삭제되지 않고 유지 |
session 내장객체 메소드 목록
- setAttribute(이름, 값) : 세션 생성
- getAttribute(이름) : 해당 속성 값을 Object형으로 반환. 해당되는 속성 이름이 없을 때는 null을 반환. (Object 형을 반환하므로 반드시 형 변환과 동시에 사용해서 형을 지정해주어야 한다.)
- getAttributeNames() : 세션 속성 이름들은 Enumeration 객체 타입으로 반환
- getCreationTime() : 세션이 생성된 시간을 반환 (1970년 1월 1일 0시 0초부터 세서, 1/1000초 값으로 반환)
- getId() : 세션에 할당된 고유 아이디를 String 타입으로 반환
- getLastAccessedTime() : 해당 세션에 클라이언트가 마지막으로 request를 보낸 시간을 반환
- getMaxInactiveInterval (숫자) : 해당 세션을 유지하기 위해 세션 유지 시간을 반환. 기본값 1800(3초)
- isNew() : 해당 세션의 생성 여부 반환. 처음 생성이면 true, 이전에 생성된 세션이면 false
- removeAttribute(이름) : 해당 속성을 제거
- setAttribute(이름, 값) : 해당 속성에 해당 값을 할당.
- setMaxInactiveInterval(숫자) : 해당 세션을 유지하기 위한 세션 유지 시간을 초 단위로 설정
- Invalidate() : 현재 세션에 저장된 모든 세션 속성을 제거
예시
더보기
package ch09.sec03.ex01;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.*;
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("/sess")
public class SessionTest extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
HttpSession session = request.getSession();
out.println("세션 아이디 : " + session.getId() + "<br>");
out.println("최초 세션 생성 시각 : " + new Date(session.getCreationTime()) + "<br>");
out.println("최초 세션 접근 시각 : " + new Date(session.getLastAccessedTime()) + "<br>");
out.println("세션 유효 시간 : " + session.getMaxInactiveInterval() + "<br>");
if(session.isNew()) {
out.print("새 세션이 만들어졌습니다.");
}
}
}
새로고침 후
세션 생성 예시
더보기
<!-- 로그인 페이지 Session01.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>
<form action="Session01Process.jsp" method="post">
<p>아 이 디 : <input type="text" name="id"></p>
<p>비밀번호 : <input type="text" name="passwd"></p>
<p><input type="submit" value="전송"></p>
</form>
</body>
</html>
<!-- 로그인 처리 페이지 Session01Process.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 user_id = request.getParameter("id");
String user_pw = request.getParameter("passwd");
if(user_id.equals("admin") && user_pw.equals("1234")){
session.setAttribute("userID", user_id);
session.setAttribute("userPW", user_pw);
out.println("세션 설정이 성공했습니다.<br>");
out.println(user_id + "님 환영합니다.");
} else {
out.println("세션 설정이 실패했습니다.");
}
%>
</body>
</html>
세션 값 확인 예시
더보기
<!-- 세션 확인하는 페이지 Session02.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 user_id = (String) session.getAttribute("userID");
String user_pw = (String) session.getAttribute("userPW");
out.println("설정된 세션의 속성값 [1] : " + user_id + "<br>");
out.println("설정된 세션의 속성값 [2] : " + user_pw + "<br>");
%>
</body>
</html>
<!-- 세션의 속성과 이름을 다 받아오는 Session03.jsp 파일 -->
<%@ page import ="java.util.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>
<%
String name;
String value;
Enumeration en = session.getAttributeNames();
int i = 0;
while(en.hasMoreElements()){
i++;
name = en.nextElement().toString();
value = session.getAttribute(name).toString();
out.println("설정된 세션의 속성 이름 [ " + i + " ] : " + name + "<br>");
out.println("설정된 세션의 속성 이름 [ " + i + " ] : " + value + "<br>");
}
%>
</body>
</html>
세션 삭제 예시
더보기
<!-- 세션 값 삭제 removeAttribute() 페이지 Session04.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>
<h4>--- 세션을 삭제하기 전 ---</h4>
<%
String user_id = (String)session.getAttribute("userID");
String user_pw = (String)session.getAttribute("userPW");
out.println("설정된 세션 이름 userID : " + user_id + "<br>");
out.println("설정된 세션 값 userPW : " + user_pw + "<br>");
session.removeAttribute("userID");
%>
<h4>--- 세션을 삭제한 후 ---</h4>
<%
user_id = (String)session.getAttribute("userID");
user_pw = (String)session.getAttribute("userPW");
out.println("설정된 세션 이름 userID : " + user_id + "<br>");
out.println("설정된 세션 값 userPW : " + user_pw + "<br>");
%>
</body>
</html>
<!-- 세션 값 삭제 전, 후 정보를 다 불러오는 페이지 Session05.jsp -->
<%@page import="java.util.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>
<h4>--- 세션을 삭제하기 전 ---</h4>
<%
String name;
String value;
Enumeration en = session.getAttributeNames();
int i=0;
while(en.hasMoreElements()){
i++;
name = en.nextElement().toString();
value = session.getAttribute(name).toString();
out.println("설정된 세션 이름 [" + i + "]" + name + "<br>");
out.println("설정된 세션 값 [" + i + "]" + value + "<br>");
}
%>
<h4>--- 세션을 삭제한 후 ---</h4>
<%
en = session.getAttributeNames();
i = 0;
while(en.hasMoreElements()){
name = en.nextElement().toString();
value = (String)session.getAttribute(name).toString();
out.println("설정된 세션 이름 [" + i + "]" + name + "<br>");
out.println("설정된 세션 값 [" + i + "]" + value + "<br>");
}
%>
</body>
</html>
<!-- 세션이 유효한지 확인하는 페이지 Session06.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>
<h4>--- 세션을 삭제하기 전 ---</h4>
<%
String user_id = (String) session.getAttribute("userID");
String user_pw = (String) session.getAttribute("userPW");
out.println("설정된 세션 이름 : " + user_id + "<br>");
out.println("설정된 세션 값 : " + user_pw + "<br>");
if(request.isRequestedSessionIdValid() == true){
out.print("세션이 유효합니다.");
} else{
out.print("세션이 유효하지 않습니다.");
}
session.invalidate();
%>
<h4>--- 세션을 삭제한 후 ---</h4>
<%
if(request.isRequestedSessionIdValid() == true){
out.print("세션이 유효합니다.");
} else{
out.print("세션이 유효하지 않습니다.");
}
%>
</body>
</html>
세션 유효 시간 예시
더보기
<!-- 세션 유효 시간 변경 페이지 session07.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>
<h4>--- 세션 유효시간 변경 전 ---</h4>
<%
int time = session.getMaxInactiveInterval()/60;
out.println("세션 유효 시간 : " + time + "분<br>");
%>
<h4>--- 세션 유효시간 변경 후 ---</h4>
<%
session.setMaxInactiveInterval(60*1);
time = session.getMaxInactiveInterval()/60;
out.println("세션 유효 시간 : " + time + "분<br>"); %>
</body>
</html>
<!-- session08.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 session_id = session.getId();
long last_time = session.getLastAccessedTime();
long start_time = session.getCreationTime();
long used_time = (last_time - start_time)/(1000*60);
out.println("세션 아이디" + session_id + "<br>");
out.println("요청 시작 시간" + start_time + "<br>");
out.println("요청 마지막 시간" + last_time + "<br>");
out.println("웹 사이트의 경과 시간" + used_time + "<br>");
%>
</body>
</html>
동시 접속자 수 예시
더보기
<!-- Login2.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>
<form name="frmLogin" method="post" action="../login11111" encType="UTF-8">
아이디 : <input type="text" name="user_id"><br>
비밀번호 : <input type="password" name="user_pw"><br>
<input type="submit" value="로그인">
<input type="reset" value="다시 입력">
</form>
</body>
</html>
// LoginTest 서블릿
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;
@WebServlet("/login11111")
public class LoginTest extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
HttpSession session = request.getSession();
String user_id = request.getParameter("user_id");
String user_pw = request.getParameter("user_pw");
System.out.println(session.isNew());
LoginImpl loginUser = new LoginImpl(user_id, user_pw);
if(session.isNew()){
session.setAttribute("loginUser", loginUser);
}
out.println("<head><script type='text/javascript'>setTimeout('history.go(0);', 5000)</script></head>");
out.println("<html><body>아이디는 " + loginUser.user_id + "<br>");
out.println("총 접속자수는 " + LoginImpl.total_user + "<br></body></html>");
}
}
// LoginImpl 클래스
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
public class LoginImpl implements HttpSessionBindingListener {
String user_id;
String user_pw;
static int total_user=0;
public LoginImpl() {}
public LoginImpl(String user_id, String user_pw) {
this.user_id = user_id;
this.user_pw = user_pw;
}
@Override
public void valueBound(HttpSessionBindingEvent arg0) {
System.out.println("사용자 접속");
++total_user;
}
@Override
public void valueUnbound(HttpSessionBindingEvent arg0) {
System.out.println("사용자 접속 해제");
total_user--;
}
}