15. [Servlet] Session

zhyun·2020년 10월 26일
0

HighJava

목록 보기
66/67
post-custom-banner

HttpSession

  1. session을 통해서 사용자(웹브라우저) 별로 구분하여 정보를 관리할 수 있다. sessionID이용
  2. 정보가 서버에 저장되기 때문에 쿠키를 사용할때보다 보안이 향상
  3. HTTP프로토콜을 이용하는 웹 환경에서 상태를 유지하기 위한 기술

Session VS Cookie

  • 공통점
    : HTTP의 무상태(Stateless)한 특성을 극복하고자 나온 기술
    : 특정 데이터를 저장해두고 페이지이동 및 새로고침 하는 등 HTTP요청이 매번 발생해도 특정 상태(데이터)를 유지할 수 있는 기술
  • 차이점
    • session
      : 서버측에 생성되어 저장
      : 세션을 식별하기 위한 세션ID값쿠키를 이용하여 보관
    • cookie
      : 브라우저(클라이언트)측에 저장

Session객체 생성

  • HttpServletRequest객체를 통해 생성하는 방법
  • service(), doGet(), doPost()등의 첫번째 매개변수로 넘어오는 HttpServletRequest객체의 getSession()메서드를 사용

HttpSession session = request.getSession(boolean값);

boolean값
: true인 경우 => 세션객체가 존재하지 않으면 새로 생성
: false인 경우 => 세션객체가 존재하지 않으면 null을 리턴

  • 세션은 브라우저 단위로 생성 => 최초 요청시 생성
  • 서버측에 생성되어진 세션브라우저별로 생선된 세션을 구분할 수 있는 세션ID를 갖게되는데 , 세션이 생성 되어질때 브라우저측에 응답하고 브라우저는 이것을 쿠키로 저장

Session 삭제

  1. invalidate()메서드 호출
  2. setMaxInactiveInterval(int interval) 메서드 호출
    : 일정시간(초)동안 요청이 없으면 세션객체 삭제됨.
  3. 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
}
  • 방법3 <sessoin-config> 설정

Session메소드

메소드리턴타입설명
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()메서드를 호출하기 전까지는 세션이 제거되지 않는다
세션 또한 객체! 서버의 메모리를 차지하므로 주의

Session 단점

  • 서버메모리에 많은걸 넣게 되서 부담..
  • 꼭 필요한 정보만 선별해서 넣어야 한다..

* 예제 : 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
	

}
profile
HI :)
post-custom-banner

0개의 댓글