서블릿-세션 추적
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 session− public void invalidate () 메서드를 호출 하여 전체 세션을 삭제할 수 있습니다 .
Setting Session timeout− public 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을 반환합니다.