헤르메스 LIFE

[JSP] session 객체 본문

Core Java

[JSP] session 객체

헤르메스의날개 2022. 12. 3. 21:59
728x90
<% session.setMaxInactiveInterval(60*60); //60분 %>

//세션의 유효시간을 20초로 셋팅
<% session.setMaxInactiveInterval(20); %>
 
//세션의 유효시간을 얻어오기
<%= session.getMaxInactiveInterval() %></ p>

<%    // Session의 속성값을 가져옵니다.
String sesValue, userValue = "computer";   
try {
      sesValue = session.getAttribute( "userID").toString();
     //sesValue에 세션안에 userID라는 속성값을 문자열타입으로 입력받습니다.
      if (! userValue.equals(sesValue)) //userValue값과 sesValue값이 같다면
           response.sendRedirect( "aa.jsp"); //aa.jsp 페이지로 이동
}
catch (NullPointerException e){ //세션안에 userID라는 속성값을 가진 id가 없다면 예외가 발생하고
      response.sendRedirect( "aa.jsp");   //aa.jsp로 catch 하여 이동합니다.
}

//위에서 부여받은 세션을 무효화 시킵니다.(로그아웃같은거죠..^^)
session.invalidate(); 
%>

[ 서블릿에서 세션(Session) Tracking ]
 
   자바랜드 (http://javaland.idcsoft.net) 에서 발췌한 글입니다.
 
----------------------------------------------------------------------
 
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.1webpagesdocsapideprecated-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을 이용하는 방법이 있습니다.
 
-----------------------------------------------------------------------------
 
1. 세션 정보 살펴보기
 
    세션 ID:                 session.getId ( )
    세션 생성:               session.isNew ( )
    생성 시간:               session.getCreationTime ( ), new Date ( session.getCreationTime ( ) )
    마지막 참조 시간:        session.getLastAccessedTime ( ), new Date ( session.getLastAccessedTime ( ) )
    세션 요청 여부(쿠키):    request.isRequestedSessionIdFromCookie ( )
    세션 요청 여부(URL):     request.isRequestedSessionIdFromURL ( )
    세션 유효 여부:          request.isRequestedSessionIdValid ( )
    이전 경로 :              request.getRequestURI ( )
    요청경로로의 리라이팅 :  response.encodeURL ( request.getRequestURI ( ) )
728x90