- session을 통해서 사용자(웹브라우저) 별로 구분하여 정보를 관리할 수 있다. sessionID이용
- 정보가 서버에 저장되기 때문에 쿠키를 사용할때보다 보안이 향상
- HTTP프로토콜을 이용하는 웹 환경에서 상태를 유지하기 위한 기술
HttpSession session = request.getSession(boolean값);
boolean값
: true인 경우 => 세션객체가 존재하지 않으면 새로 생성
: false인 경우 => 세션객체가 존재하지 않으면 null을 리턴
- invalidate()메서드 호출
- setMaxInactiveInterval(int interval) 메서드 호출
: 일정시간(초)동안 요청이 없으면 세션객체 삭제됨.- web.xml에서
<session-config>
설정하기 => 분단위로 설정함
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//세션을 가져오는데 없으면 생성한다.
HttpSession session = req.getSession(true);
//세션삭제
//session.invalidate(); //방법1.
session.setMaxInactiveInterval(20); //방법2
}
<sessoin-config> 설정
메소드 | 리턴타입 | 설명 |
---|---|---|
setAttribute(String name,Object value) | void | 세션에 데이터를 저장 name이 저장할 데이터의 이름이 되고, value에 저장할 값을 지정 Object형이므로 모든 객체를 저장 가능 |
getAttribute(String name) | Object | 세션에 저장한 데이터중 name에 해당하는 값을 리턴 Object형이므로 저장 이전의 원래 타입으로 형변환하여 사용 |
getId() | String | 브라우저별로 생성되어진 세션을 구분하기 위한 ID를 리턴 |
getLastAccessedTime() | void | 웹브라우저가 가장 최근 세션에 접근한 시간을 구한다 세션에 접근했다는 것은 세션이 유효한 페이지에 접근했다는 뜻 JSP를 기준으로 가장 최근에 page디렉티브의 session값이 true인 페이지에 접근한 시간을 의미 1970.1.1을 기준으로 몇 ms(1/1000초)가 흘렀는지를 정수값으로 리턴 |
invalidate() | void | 세션을 종료 종료된 세션 객체는 곧 제거되며 이후에 요청시 새로운 세션이 생성 |
setMaxInactiveInterval(int interval) | void | 세션의 유효시간을 초단위로 지정 유효시간은 가장 최근에 세션에 접근한 이후 유효한 시간 getLastAccessedTime()메서드를 호출했을때의 시간과 현재 시간 사이의 간격을 의미 0또는 음수로 지정하는 경우 invalidate()메서드를 호출하기 전까지는 세션이 제거되지 않는다 세션 또한 객체! 서버의 메모리를 차지하므로 주의 |
* 예제 : 14_ServletTest / T06_ServletSessionTest
package kr.or.ddit.basic;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class T06_ServletSessionTest extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//세션을 가져오는데 없으면 생성한다.
HttpSession session = req.getSession(true);
//세션삭제------------------------
//session.invalidate(); //방법1.
//session.setMaxInactiveInterval(20); // 방법2.일정시간(초단위)동안 요청없으면 세션객체 삭제됨
// 방법3. web.xml에서 <session-config>1(분단위)</session-config> 추가
//------------------------------
//생성시간 가져오기
Date createTime = new Date(session.getCreationTime());
//마지막 접근시간 가져오기
Date lastAccessTime = new Date(session.getLastAccessedTime()); //long타입
String title = "재 방문을 환영합니다.";
int visitCount = 0; // 방문횟수=> 새로고침할때 쌓이는 횟수 확인
String userId = "zhyun"; //사용자ID
if(session.isNew()) { //세션이 새로 만들어졌는지 확인..
title = "처음 방문을 환영합니다.";
session.setAttribute("userId", userId); // ("키값(속성값)", value)
}else {//재방문인 경우
//세션정보에서 방문횟수 , 사용자id 가져오는 과정
//getAttribute() 메소드 : Object형이므로 저장 이전의 원래 타입으로 형변환하여 사용합니다.
visitCount = (Integer)session.getAttribute("visitCount");//방문횟수
visitCount++;
userId = (String) session.getAttribute("userId");
}
System.out.println("방문횟수 : "+visitCount);
session.setAttribute("visitCount", visitCount);
//응답헤더에 인코딩 미 content-type 설정
resp.setContentType("text/html");
// resp.setContentType("text/html;charset=utf-8");
//resp.addHeader("Content-Type", "text/html"); 헤더정보 추가 참고
PrintWriter out = resp.getWriter();
out.println("<!DOCTYPE html>\n"
+ "<head><title>"+title+ "</title></head>"
+ "<body>\n" + "<h1 align=\"center\">" + title + "</h1>\n"
+ "<h2 align=\"center\">세션정보</h2>"
+ "<table border=\"1\" align=\"center\">\n"
+ "<tr bgcolor=\"orange\">\n"
+ "<th>구분</th><th>값</th></tr>"
+ "<tr><td>세션ID</td><td>"+session.getId()+ "</td></tr>"
+ "<tr><td>생성시간</td><td>"+createTime+ "</td></tr>"
+ "<tr><td>마지막접근시간</td><td>"+lastAccessTime+ "</td></tr>"
+ "<tr><td>사용자ID</td><td>"+userId+ "</td></tr>"
+ "<tr><td>방문횟수</td><td>"+visitCount+ "</td></tr>"
+ "</table></body></html>" );
}//doGet
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}//doPost
}