SESSION(세션)


1session객체

 

session객체는 세션에 관련된 정보를 핸들하는 객체입니다. 웹서버와 클라이언트간의 세션 데이터를 저장하고 있는 객체죠. 그런데 세션이라는 것이 왜 필요할까요? HTTP프로토콜은 Stateless을 기본으로 합니다. ftp는 지속적인 연결설정이 되어 있는 반면 http는 순간적으로 연결하고 연결설정을 바로 끊어 버립니다. 이것을 개선하기 위해서 나온것이 session이죠. 그래서 Stateless의 극복이라고도 하죠.

 

 

2클라이언트의 웹브라우져와 언제까지 세션이 유지될까?
 

클라이언트에서 하나의 jsp파일에 접근하고 그리고 jsp에서 session설정이 true로 되어 있다면 세션이 끝나는 지점은 jsp에서 세션시간설정이 끝났을 때 세션은 마무리되고 그리고 웹브라우져를 닫았다가 다시 오픈하면 즉시 세션이 사라지게 된다.

☞디폴트세션타임은 30분입니다. 

 

3세션의 멤버 메서드를 알아볼까요
 

public String getID()

세션이 한번 열리면 고유한 ID를 갖게 됩니다. 이 아이디를 얻겠다는 것이죠

public long getCreationTime()

세션이 처음 생성된 시간을 밀리 초로 계산하여 long형 정수로 리턴합니다. 기준은 70년1월1일 00시 00분 00초입니다.

public long getLastAccessedTime()

클라이언트 요청이 마지막으로 시도된 시간을 밀리초로 반환합니다.

public int getMaxInactiveInterval()

클라이언트의 요구가 없을 때 서버가 현재의 세션을 언제까지 유지할지를 정수로 리턴합니다. 이때 기본 디폴트 세션마감시간은 30분으로 지정되어 있습니다.

public void invalidate()

현재의 세션을 마감해 버립니다. 세션의 속성값들이 사라지는거죠

public boolean isNew()

서버측에서 새로운 session객체를 생성하고 아직 클라이언트에게 세션ID를 할당하지 않은 경우 true를 리턴하고 기존의 세션이 유지되고 있는 상태라면 false를 반환합니다.

public void setMaxInactiveInterval(int seconds)

세션 시간을 설정합니다. 그리고 이 시간이 지나면 당연히 세션은 마감되겠죠(밀리세컨드단위입니다)

 


 

key: 객체를 가리키는 이름

value: 실제 객체

 

session.setAttribute(key, value) => 저장

session.getAttribute(key) => 불러오기

 

String memberID1 = "ID1";

session.setAttribute("memID", memberID1);

 (key: memID, value: String형 memberID1

 

ID1이란 값은 memberID1 객체 속에 담긴 정보라고 생각하세요.

 

로그인 세션의 경우

1. 입력받은 정보(ID, 패스워드)를 DB에서 찾고 유효한지 확인

2. ID, 패스워드와 함께 기타 유저 정보를 받아서 유저 정보 객체(ex:"Info) 저장

3. 그 객체를 다시 세션에 저장(ex: session.setAttribute("Info", Info);

4. 세션이 필요한 페이지는 세션에 저장된 정보를 받아서 알맞게 이용하면 됩니다.   

(ex: Info info = (Info)session.getAttribute("Info"));

 

 

말씀하신 것으로 설명드리면

1. session.getAttribute("memID")  memID라는 이름으로 저장된 객체를 불러오기.

2. session에 아무것도 저장이 안 되있으면 null값을 반환 

3. 위와 같이 저장한 경우, String형 memberID1 객체를 불러오게 됩니다.

4. 불러온 객체는 Object형으로 변환되어있기 때문에 다시 형 변환을 시켜줘야 합니다.

ex) (String) <= 요 부분입니다.

 

 

EXAMPLE 1:

 

//세션 등록

session.setAttribute("userId", userId); //왼쪽파라미터는 이름을 명시, 두번째는 값을 저장.
session.setAttribute("passWd", passWd);
session.setAttribute("userName", userName);

session.setAttribute("mgrDiv", mgrDiv);

 

 

이는 세션에 적용된 페이지에서

session.getAttribute("userId"); 로 값을 가져옮

 

//세션 삭제

response.addHeader("Pragma", "No-cache");
response.addHeader("Cache-Control", "no-cache");
response.addDateHeader("Expires", 1);
session.invalidate();

 

세션 체크ex)

if(session != null && session.getAttribute("userId") != null && !session.getAttribute("userId").equals("")){

   //session에 userId라는 값이 존재할 때

}else{

   //userId를 사용하지 못할 때

}

 

 

 

EXAMPLE 2:

 

getCreationTime()을 사용하려다가 한번 만들어 봤습니다.


<%@ page contentType="text/html;" import="java.util.*,java.text.*" %>

<%
// javax.servlet.http Interface HttpSession


// session Creation / Last Access Time
long logonTime = session.getCreationTime();    //세션이 만들어진 시간
long lastAccessTime = session.getLastAccessedTime();     //최종접속시간

//날짜 타입으로 변환합니다.
SimpleDateFormat sFormat = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss");

Date logonTimeF = new Date(logonTime);
Date lastAccessTimeF = new Date(lastAccessTime);

String logonTimeStr = sFormat.format(logonTimeF);
String lastAccessTimeStr = sFormat.format(lastAccessTimeF);

out.print("LOGON TIME : " + logonTimeStr + "<BR>");
out.print("LAST ACCESS TIME : " + lastAccessTimeStr + "<BR>");
out.print("SESSION MAX INACTIVE INTERVAL : " + (session.getMaxInactiveInterval() / 60) + " MIN <BR>");

//세션타임아웃 시간을 기본 30분에서 40분으로 늘립니다.
session.setMaxInactiveInterval(2400);


// session Attribute
String sName="";
Integer value=new Integer(1004);

session.setAttribute("bigjava", value);
Enumeration attEnum = session.getAttributeNames();

while(attEnum.hasMoreElements()){
        sName=(String)attEnum.nextElement();
        out.print( sName + " : " + session.getAttribute(sName) + "<BR>");
        session.removeAttribute(sName);
}


// session ID
String mySessionID = session.getId();
out.print("SESSION ID : " + mySessionID + "<BR>");

%>

 

EXAMPLE 3:

 

Q:

[1번 페이지]

session생성 test

id [             ]   확인  <---text box에 값을 넣은 후 확인을 클릭 하면

--------------------------------------------------------------------

웹페이지가 뜨면서   

 

[2번 페이지]

새로운 세션이 생성되었습니다.

세션ID : ALSJFLAJFLJASDLKJF

세션내용보기 <---링크

-------------------------------------------------------------

2페이지의 세션내용보기 클릭하면 웹페이지가 뜨면서

[3번 페이지]

Attribute id 값 :1234  <--1번페이지 텍스트박스에 넣었던값

isNew():false

세션id:

세션생성시간:

세센마지막접속시간

Session 삭제하기  <------링크

--------------------------------------------------------------------

3페이지의 세션 삭제하기 클릭하면 웹페이지 뜨면서

[4페이지] 

로그인페이지로 <===클릭하면 1페이지

 

A:

---index.jsp---

[%@page language="java" contentType="text/html; charset=euc-kr"%]
[html]
[head]
  [script]
   function idSubmit(){
    document.idForm.action = "test1.jsp";
    document.idForm.submit();
   }
  [/script]
[/head]

[body]

[!-- Header --]
[table width="100%"]
[form name="idForm" method="post"]
    [tr]
        [td]ID : [input type="text" name="id" size="15"]&nbsp;[input type="button" value="확인" onClick="idSubmit()"][/td]
    [/tr]
[/form]
[/table]
[/body]
[/html]

---test1.jsp---

[%@page language="java" contentType="text/html; charset=euc-kr"%]
[html]
[%
 session = request.getSession(true);
 String id = request.getParameter("id");
 request.getSession().setAttribute("id", id);
%]
 [body]
 [h3]Session 생성 [/h3] 
 새로운 세션이 생성되었습니다.[BR]
 세션ID : [%=session.getId()%][BR]
 [a href="test2.jsp"]세션내용보기[BR]
 [/body]
[/html]

 

---test2.jsp---

[%@page language="java" contentType="text/html; charset=euc-kr"%]
[html] 
[body] 
[h3]Session 정보 [/h3] 
Attribute id 값 :[%=(String)request.getSession().getAttribute("id")%][br]
isNew():[%=session.isNew()%][br] 
세션ID:[%=session.getId() %][br] 
세션생성시간:[%=new java.util.Date(session.getCreationTime()).toString() %][br] 
세션마지막접속시간:[%=new java.util.Date(session.getLastAccessedTime()).toString() %][br] 
[a href="test3.jsp"]세션삭제하기[/a]
[/body] 
[/html]

 

---test3.jsp---

[%@page language="java" contentType="text/html; charset=euc-kr"%]
[%
session = request.getSession(false); 
if(session != null){ 
 session.invalidate(); 
}

response.sendRedirect("index.jsp");

%]

 

session객체는 내장객체를 사용하였고 '['는 '<'로 바꾸어 사용하면 됩니다.

이상입니다.

[출처] JSP Session 세션|작성자 nkmin80

 

 

==================================================================================================================

==================================================================================================================

 

서블릿에서 세션(Session) Tracking

 
자바랜드 (http://javaland.idcsoft.net) 에서 발췌한 글입니다.
 
 
차니랍니다. 얼마전 Session 때문에 어이없는 시간을 좀 낭비했지만
결과야 어이없이 해결되었지만, 그런데로 얻은게 있었던 정리를 좀 해봅니다.
Session에서 잘안되시는 부분 있으면 참고하세요.
 
----------------------------------------------------------------------
1. 기본적인 Session 처리를 위하여 ...
 
Session 처리를 위하여 우리는
 
HttpSession session = req.getSession(boolean create);
 
라는 문장을 사용합니다. 여기에서 우선 3가지를 알고 있어야하는데
그것의 getSession의 사용입니다.
 
ㅇ getSession(true) :
   Session object를 얻어옴에 있어서 Request에 대한 새로운
   Session을 create 해줍니다.
ㅇ getSession(false) :
   현재의 Session이 존재한다면 그 Session은 그대로 return 해줍니다.
   Session이 존재하지 않는다면 null로 리턴해 줍니다.
ㅇ getSession() :
   getSession(true)가 새로운 Session의 create만 하는거고
   getSession(false)가 현재의 Session을 그대로 return하는거라면 ..
   getSession()는 우선 Session의 존재여부를 확인하여 Session이 없다면
   새로이 Session을 create 해주고, 존재하는 Session이 있다면 그대로
   return을 해주는 녀석이랍니다. (위의 두개의 메소드의 장점을 취한 녀석이죠)
   이 녀석은 2.1에서 새로이 나온 것으로 알고 있습니다.
   (역시 참고, JSDK의 새로운 버젼에서의 deprecated 된 것에 대한 내용은
    C:\jsdk2.1\webpages\docs\api\deprecated-list.html 보시면 알 수
    있습니다. 그런데 새로운 것에 대한 것은 사이트상에서 새로운 버젼이
    나왔다는 설명이후에는 사라지는지 안보이네요. ^^; 찾으셨다면 알려주시길.)
 
2. Session 값의 저장
 
1의 기본처리를 마쳤다면 ...
 
session.putValue(String name, Object value);
 
를 통하여 주어진 name을 가지고 session내에 알려진 object를 묶어줍니다.
(binding 한다고 합니다.)
 
putValue 메소드는 name으로 binding 된 object는 replace 되어집니다.
session에 의해서 binging 된 object의 모든 name을 얻어오기 위해서는
getValueNames() 메소드를 사용하고, session으로 부터 object를
제거하기 위해서는 removeValue()를 사용합니다.
 
Parameter가 String과 Object 라는 점과
여기의 name과 value에는 null이 오지 못함을 주의하시기 바랍니다.
 
3. Session 가져오기
 
위에서 binging 된 session은
 
session.getValue(String name)
 
을 통하여 가져오면 됩니다.
 
주어진 name을 가지고 binding처리되어진 session을 가져오며,
만약 주어진 name에 대한 session으로 binding 된 object가 없으면
null을 return 합니다.
 
실제 프로그래밍에서 getValue 메소드의 null 값 체크를 가지고 프로그래밍을
합니다.
예)
 
public class A extends HttpServlet {
..
생략
..
String SessionValue = null;
 
HttpSession session = new req.getSession();
SessionValue = (String)session.getValue("JavalandName");
 
if (SessionValue == null) {
  어떤처리
} else {
  어떤처리
} // if 처리 끝
 
} // class의 끝
 
그리고 위의 소스에서 볼 수 있듯이
getValue에서 가져오는 값은 Object 입니다.
putValue에서 String으로 name에 대하여 Object value를 binding 했기
때문이죠.
또 위와 같은 방법이 아닌 isNew() 메소드를 사용하여 처리하기도 하니
API를 참고하시기 바랍니다.
 
4. Session에서 Invalidate/unbind 처리
 
Session을 무효로 만들고 unbind 처리하기 위해서는 간단히
invalidate() 메소드를 사용해 주시면 됩니다.
 
위의 예제의 Session을 Invalidate/unbind 처리 하고자 한다면 ...
 
 session.invalidate();
 
해주시면 됩니다.
여기에서 주의하실 점은 invalidate() 메소드는 return 타입이 void로
이기에 invalidate() 처리후에 다른 사이트로 옮기는 경우가 프로그래밍
상에서 sendRedirect()를 통한 사이트 이동을 많이 하게 됩니다.
이때, 한번 더 처리해주셔야 할 것이 있다면 ...
putValue(), getValue() 에서 처리했던 value 값을 다시 한번
null로 초기화 시킨후에 sendRedirect() 메소드를 사용하시라는 겁니다.
이 처리의 경우, 실제 컴파일시나 runtime 시에 어떤 에러도 나오지
않기 때문에 session이 계속 남아 있는 것 처럼 될 수 있습니다.
(저의 경우, 이처리를 안해줘서 3틀간 고생을 했지요. ^^;)
 
5. 알아두어야 할 것 및 Tip
 
(1) JSDK2.1(Servlet Spec 2.1) 에서는 예전에 사용되었던
javax.servlet.http.HttpSessionContext Interface가 deprecated되었다는
것을 알고 있으시기 바랍니다. 이는 보안상의 문제라고 하니 되도록 사용을
삼가하심이 좋을 듯합니다.
 
(2) Session과 Cookie 의 사용에 있어서 sendRedirect() 메소드를 이용하여
처리의 결과에 대하여 사이트를 옮기는 것을 많이 이용합니다.
여기에서 Session과 Cookie의 사용시에는
 
response.sendRedirect(response.encodeURL("/servlet/기타");
또는
response.sendRedirect(response.encodeRedirectURL("/servlet/기타");
 
와 같은 방법을 사용하시기 바랍니다. (두개의 차이는 확실히 구별되지는 않지만
아래 방법보다는 위의 방법을 사용시에 적용이 잘된다는 기타사이트의 Q/A
게시판에 올라오곤 합니다.)
그리고 encodeURL(), encodeRedirectURL() 메소드 외에
encodeUrl(), encodeRedirectUrl() 메소드가 있는데 이는 deprecated되었음을
아시기 바랍니다.
 
(3) session의 유지 시간 설정하기
 
Servlet 2.1이후에 등장한 메소드로
 
setMaxInactiveInterval(int interval) 을 사용하시면 됩니다.
 
자바웹서버에서는 default로 30분이 기본으로 되어져 있지만,
일반적인 JSDK를 사용한 개발시에는 자체적으로 시간을 설정할 수가 없었습니다.
이 문제를 보안하기 위하여 위의 메소드를 지원하게 되었답니다.
 
또 한가지 여기에서 주의하실 점은
JServ를 이용하여 개발하시는 분은 이 메소드를 사용하실 수가 없다는 점입니다.
왜냐? 아직 JServ를 Servlet2.0 API를 기준으로 하기 때문이죠.
이 문제는 Jakarta 프로젝트의 첫번째 제품(?)이 나와야 해결이 가능합니다.
이것의 처리를 위해서는 현재로써는 JRun을 이용하는 방법이 있습니다.
 
 
------------------------------------------------------------------------
Session Tracking 에서 실제 사용상의 처리 부분만 간단히 정리해 본 것입니다.
 
위 자료는 자바랜드 (http://javaland.idcsoft.net) 를 명시하여 주시면
어디든 제 사용이 가능합니다


출처 - http://blog.naver.com/PostView.nhn?blogId=tyboss&logNo=70022004193


'Development > JSP & Servlet' 카테고리의 다른 글

jsp - 클라이언트 IP 확인 및 로컬 IP 얻기  (0) 2012.08.21
JSP - 세션 관리  (0) 2012.07.07
JSP - 로그인 필터 예제 (Redirect 처리)  (0) 2012.05.23
jsp/servlet scope  (0) 2012.05.14
JSP 소스 사이트  (0) 2012.05.07
Posted by linuxism
,