관리 메뉴

IT 쟁이

서블릿에서 세션(Session) 사용하기 본문

JSP

서블릿에서 세션(Session) 사용하기

클라인STR 2008. 5. 24. 23:01
자바랜드 (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) 를 명시하여 주시면
어디든 제 사용이 가능합니다.
Comments