05.JSP2008. 10. 19. 15:38
반응형
1 session객체

 

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객체는 내장객체를 사용하였고 '['는 '<'로 바꾸어 사용하면 됩니다.

Posted by 1010