서블릿-세션 추적

HTTP는 "상태 비 저장"프로토콜입니다. 즉, 클라이언트가 웹 페이지를 검색 할 때마다 클라이언트는 웹 서버에 대한 별도의 연결을 열고 서버는 이전 클라이언트 요청 기록을 자동으로 유지하지 않습니다.

여전히 웹 클라이언트와 웹 서버 간의 세션을 유지하는 세 가지 방법이 있습니다.

쿠키

웹 서버는 고유 한 세션 ID를 각 웹 클라이언트에 쿠키로 할당 할 수 있으며 클라이언트의 후속 요청에 대해 수신 된 쿠키를 사용하여 인식 할 수 있습니다.

여러 번 브라우저가 쿠키를 지원하지 않기 때문에 이것은 효과적인 방법이 아닐 수 있으므로 세션을 유지하기 위해이 절차를 사용하지 않는 것이 좋습니다.

숨겨진 양식 필드

웹 서버는 다음과 같이 고유 한 세션 ID와 함께 숨겨진 HTML 양식 필드를 보낼 수 있습니다.

<input type = "hidden" name = "sessionid" value = "12345">

이 항목은 양식이 제출 될 때 지정된 이름과 값이 GET 또는 POST 데이터에 자동으로 포함됨을 의미합니다. 웹 브라우저가 요청을 다시 보낼 때마다 session_id 값을 사용하여 다른 웹 브라우저를 추적 할 수 있습니다.

이것은 세션을 추적하는 효과적인 방법 일 수 있지만 일반 (<A HREF...>) 하이퍼 텍스트 링크를 클릭해도 양식이 제출되지 않으므로 숨겨진 양식 필드도 일반 세션 추적을 지원할 수 없습니다.

URL 재 작성

세션을 식별하는 각 URL 끝에 몇 가지 추가 데이터를 추가 할 수 있으며 서버는 해당 세션 식별자를 해당 세션에 대해 저장 한 데이터와 연결할 수 있습니다.

예를 들어, http://tutorialspoint.com/file.htm;sessionid = 12345를 사용하면 세션 식별자가 sessionid = 12345로 첨부되어 클라이언트를 식별하기 위해 웹 서버에서 액세스 할 수 있습니다.

URL 재 작성은 세션을 유지하는 더 좋은 방법이며 브라우저가 쿠키를 지원하지 않는 경우에도 작동합니다. URL 재 작성의 단점은 단순한 정적 HTML 페이지의 경우에도 세션 ID를 할당하기 위해 모든 URL을 동적으로 생성해야한다는 것입니다.

HttpSession 객체

위에서 언급 한 세 가지 방법 외에도 서블릿은 둘 이상의 페이지 요청 또는 웹 사이트 방문에서 사용자를 식별하고 해당 사용자에 대한 정보를 저장하는 방법을 제공하는 HttpSession 인터페이스를 제공합니다.

서블릿 컨테이너는이 인터페이스를 사용하여 HTTP 클라이언트와 HTTP 서버 간의 세션을 만듭니다. 세션은 사용자의 두 개 이상의 연결 또는 페이지 요청에서 지정된 기간 동안 지속됩니다.

공용 메서드를 호출하여 HttpSession 개체를 얻을 수 있습니다. getSession() 아래와 같이 HttpServletRequest의-

HttpSession session = request.getSession();

문서 내용을 클라이언트로 보내기 전에 request.getSession () 을 호출해야합니다 . 다음은 HttpSession 객체를 통해 사용할 수있는 중요한 방법에 대한 요약입니다.

Sr. 아니. 방법 및 설명
1

public Object getAttribute(String name)

이 메서드는이 세션에서 지정된 이름으로 바인딩 된 개체를 반환하거나 이름 아래에 바인딩 된 개체가 없으면 null을 반환합니다.

2

public Enumeration getAttributeNames()

이 메서드는이 세션에 바인딩 된 모든 개체의 이름을 포함하는 String 개체의 열거 형을 반환합니다.

public long getCreationTime()

이 메서드는 GMT 1970 년 1 월 1 일 자정 이후로 측정 된이 세션이 생성 된 시간을 반환합니다.

4

public String getId()

이 메서드는이 세션에 할당 된 고유 식별자가 포함 된 문자열을 반환합니다.

5

public long getLastAccessedTime()

이 메소드는 1970 년 1 월 1 일 자정 GMT 이후 밀리 초 형식으로 세션의 마지막 액세스 시간을 반환합니다.

6

public int getMaxInactiveInterval()

이 메소드는 서블릿 컨테이너가 클라이언트 액세스 사이에 세션을 열린 상태로 유지하는 최대 시간 간격 (초)을 리턴합니다.

7

public void invalidate()

이 메서드는이 세션을 무효화하고 여기에 바인딩 된 모든 개체를 바인딩 해제합니다.

8

public boolean isNew(

이 메서드는 클라이언트가 아직 세션에 대해 알지 못하거나 클라이언트가 세션에 참여하지 않기로 선택한 경우 true를 반환합니다.

9

public void removeAttribute(String name)

이 메서드는이 세션에서 지정된 이름으로 바인딩 된 개체를 제거합니다.

10

public void setAttribute(String name, Object value)

이 메서드는 지정된 이름을 사용하여 개체를이 세션에 바인딩합니다.

11

public void setMaxInactiveInterval(int interval)

이 메소드는 서블릿 컨테이너가이 세션을 무효화하기 전에 클라이언트 요청 사이의 시간 (초)을 지정합니다.

세션 추적 예

이 예에서는 HttpSession 개체를 사용하여 세션의 생성 시간과 마지막으로 액세스 한 시간을 찾는 방법을 설명합니다. 요청이없는 경우 새 세션을 요청과 연결합니다.

// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
 
// Extend HttpServlet class
public class SessionTrack extends HttpServlet {
 
   public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
         
      // Create a session object if it is already not  created.
      HttpSession session = request.getSession(true);
         
      // Get session creation time.
      Date createTime = new Date(session.getCreationTime());
         
      // Get last access time of this web page.
      Date lastAccessTime = new Date(session.getLastAccessedTime());

      String title = "Welcome Back to my website";
      Integer visitCount = new Integer(0);
      String visitCountKey = new String("visitCount");
      String userIDKey = new String("userID");
      String userID = new String("ABCD");

      // Check if this is new comer on your web page.
      if (session.isNew()) {
         title = "Welcome to my website";
         session.setAttribute(userIDKey, userID);
      } else {
         visitCount = (Integer)session.getAttribute(visitCountKey);
         visitCount = visitCount + 1;
         userID = (String)session.getAttribute(userIDKey);
      }
      session.setAttribute(visitCountKey,  visitCount);

      // Set response content type
      response.setContentType("text/html");
      PrintWriter out = response.getWriter();

      String docType =
         "<!doctype html public \"-//w3c//dtd html 4.0 " +
         "transitional//en\">\n";

      out.println(docType +
         "<html>\n" +
            "<head><title>" + title + "</title></head>\n" +
            
            "<body bgcolor = \"#f0f0f0\">\n" +
               "<h1 align = \"center\">" + title + "</h1>\n" +
               "<h2 align = \"center\">Session Infomation</h2>\n" +
               "<table border = \"1\" align = \"center\">\n" +
                  
                  "<tr bgcolor = \"#949494\">\n" +
                     "  <th>Session info</th><th>value</th>
                  </tr>\n" +
                     
                  "<tr>\n" +
                     "  <td>id</td>\n" +
                     "  <td>" + session.getId() + "</td>
                  </tr>\n" +
                  
                  "<tr>\n" +
                     "  <td>Creation Time</td>\n" +
                     "  <td>" + createTime + "  </td>
                  </tr>\n" +
                  
                  "<tr>\n" +
                     "  <td>Time of Last Access</td>\n" +
                     "  <td>" + lastAccessTime + "  </td>
                  </tr>\n" +
                  
                  "<tr>\n" +
                     "  <td>User ID</td>\n" +
                     "  <td>" + userID + "  </td>
                  </tr>\n" +
                  
                  "<tr>\n" +
                     "  <td>Number of visits</td>\n" +
                     "  <td>" + visitCount + "</td>
                  </tr>\n" +
               "</table>\n" +
            "</body>
         </html>"
      );
   }
}

위의 서블릿 컴파일 SessionTrackweb.xml 파일에 적절한 항목을 만듭니다. 이제 http : // localhost : 8080 / SessionTrack 을 실행하면 처음 실행할 때 다음 결과가 표시됩니다.

Welcome to my website

Session Infomation

Session info value
id 0AE3EC93FF44E3C525B4351B77ABB2D5
Creation Time Tue Jun 08 17:26:40 GMT+04:00 2010
Time of Last Access Tue Jun 08 17:26:40 GMT+04:00 2010
User ID ABCD
Number of visits 0

이제 동일한 서블릿을 두 번째로 실행하려고하면 다음과 같은 결과가 표시됩니다.

Welcome Back to my website

Session Infomation

info type value
id 0AE3EC93FF44E3C525B4351B77ABB2D5
Creation Time Tue Jun 08 17:26:40 GMT+04:00 2010
Time of Last Access Tue Jun 08 17:26:40 GMT+04:00 2010
User ID ABCD
Number of visits 1

세션 데이터 삭제

사용자의 세션 데이터를 완료하면 몇 가지 옵션이 있습니다.

  • Remove a particular attribute− 특정 키와 관련된 값을 삭제하기 위해 public void removeAttribute (String name) 메소드를 호출 할 수 있습니다 .

  • Delete the whole sessionpublic void invalidate () 메서드를 호출 하여 전체 세션을 삭제할 수 있습니다 .

  • Setting Session timeoutpublic void setMaxInactiveInterval (int interval) 메서드를 호출 하여 세션에 대한 타임 아웃을 개별적으로 설정할 수 있습니다.

  • Log the user out − 서블릿 2.4를 지원하는 서버는 다음을 호출 할 수 있습니다. logout 클라이언트를 웹 서버에서 로그 아웃하고 모든 사용자에게 속한 모든 세션을 무효화합니다.

  • web.xml Configuration − Tomcat을 사용하는 경우 위에서 언급 한 방법 외에 다음과 같이 web.xml 파일에서 세션 타임 아웃을 설정할 수 있습니다.

<session-config>
   <session-timeout>15</session-timeout>
</session-config>

제한 시간은 분으로 표시되며 Tomcat에서 기본 제한 시간 인 30 분을 대체합니다.

서블릿의 getMaxInactiveInterval () 메서드는 해당 세션의 시간 초과 기간을 초 단위로 반환합니다. 따라서 세션이 web.xml에서 15 분 동안 구성된 경우 getMaxInactiveInterval ()은 900을 반환합니다.