English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

JSP 세션

HTTP는 상태 없는 프로토콜로, 이는 클라이언트가 웹 페이지를 검색할 때마다 별도의 서버 연결을 열어야 한다는 것을 의미하며, 따라서 서버는 이전 클라이언트 요청의 어떤 정보도 기록하지 않습니다.

클라이언트와 서버의 세션을 유지하는 데 세 가지 방법이 있습니다:

    Cookies

네트워크 서버는 고유한 세션 ID를 쿠키로 설정하여 각 클라이언트를 대표하고, 이 클라이언트가 향후 요청을 식별하는 데 사용할 수 있습니다.

이 방법은 항상 효과적이지 않을 수 있으며, 많은 경우 브라우저가 쿠키를 지원하지 않으므로, 이 방법을 세션 유지를 위해 사용하지 않는 것을 권장합니다.

    숨겨진 양식 필드

네트워크 서버는 숨겨진 HTML 양식 필드와 독특한 세션 ID를 보낼 수 있습니다. 예를 들어:

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

이 항목은, 양식이 제출될 때, 지정된 이름과 값이 자동으로 GET이나 POST 데이터에 포함되며, 브라우저가 요청을 보낼 때마다 session_id의 값이 다른 브라우저의 추적을 저장할 수 있다는 것을 의미합니다.

이 방법은 효과적일 수 있지만, <A HREF> 태그에서 링크를 클릭할 때 GET이나 POST 데이터에 포함되지 않으므로, 숨겨진 텍스트 필드도 일반 세션 추적을 지원하지 않습니다.

    URL 재작성

URL마다 추가적인 데이터를 추가하여 세션을 구분할 수 있습니다. 서버는 이 데이터를 사용하여 세션 식별자를 연결할 수 있습니다.

예를 들어, http://oldtoolbag.com/file.htm;sessionid=12345세션 식별자는 sessionid=로 합니다12345서버는 이 데이터를 사용하여 클라이언트를 인식할 수 있습니다.

비교해 보면, URL을 다시 작성하는 것이 더 나은 방법입니다. 이 경우, 브라우저가 쿠키를 지원하지 않더라도 작동하며, 단점은 각 URL에 대해 세션 ID를 동적으로 지정해야 한다는 것입니다. 이는 간단한 HTML 페이지라도 마찬가지입니다.

    세션 객체

위와 같은 방법 외에도, JSP는 servlet이 제공하는 HttpSession 인터페이스를 사용하여 사용자를 인식하고, 이 사용자의 모든 방문 정보를 저장합니다.

기본적으로, JSP는 세션 추적을 허용하며, 새로운 HttpSession 객체가 새로운 클라이언트 예제를 자동으로 생성됩니다. 세션 추적을 차단하려면 명시적으로 끄기 필요가 있으며, page 지시문의 session 속성 값을 false로 설정하여 이렇게 합니다:

<%@ page session="false" %>

JSP 엔진은 개발자에게 은밀하게 세션 객체를 노출시킵니다. 세션 객체가 제공되면, 개발자는 데이터를 쉽게 저장하거나 검색할 수 있습니다.

다음 표는 세션 객체의 일부 중요한 메서드를 나열합니다:

S.N.메서드 & 설명
                1public Object getAttribute(String name) 지정된 이름과 연결된 객체를 반환하며, 존재하지 않으면 null을 반환합니다
                2public Enumeration getAttributeNames() 세션 객체에서 모든 객체 이름을 반환합니다
                3public long getCreationTime() session 객체가 생성된 시간을 밀리초 단위로 반환하며,1970년1월1오전 0시부터 시작합니다
                4public String getId() session 객체의 ID를 반환합니다
                5public long getLastAccessedTime() 클라이언트가 마지막으로 접근한 시간을 밀리초 단위로 반환하며,1970년1월1오전 0시부터 시작합니다
                6public int getMaxInactiveInterval() 최대 시간 간격을 초단위로 반환하며, servlet 컨테이너는 이 기간 동안 세션이 열려 있도록 유지합니다
                7public void invalidate() session을 무효화하고, 해당 session에 바인딩된 모든 객체를 해제합니다
                8public boolean isNew() 새 클라이언트인지 여부나 클라이언트가 세션에 참여를 거부했는지 여부를 반환합니다
                9public void removeAttribute(String name) session에서 지정된 이름의 객체를 제거합니다
                10public void setAttribute(String name, Object value)  지정된 이름과 값으로 객체를 생성하고 session에 바인딩합니다
                11public void setMaxInactiveInterval(int interval) 초단위로 시간을 지정하면, servlet 컨테이너는 이 기간 동안 세션이 유효하도록 유지합니다

JSP 세션 애플리케이션

HttpSession 객체를 사용하여 생성 시간과 마지막 접근 시간을 가져오는 방법을 설명하는 이 예제입니다. request 객체에 새로운 session 객체를 연결하거나 없다면 연결합니다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.io.*,java.util.*" %>
<%
   // session 생성 시간을 가져옵니다
   Date createTime = new Date(session.getCreationTime());
   // 최근 방문 페이지의 시간을 가져옵니다
   Date lastAccessTime = new Date(session.getLastAccessedTime());
   String title = "再次访问基础教程网示例";
   Integer visitCount = new Integer(0);
   String visitCountKey = new String("visitCount");
   String userIDKey = new String("userID");
   String userID = new String("ABCD");
   // 웹 페이지에 새 방문자가 있는지 검사합니다
   if (session.isNew()){
      title = "访问基础教程网示例";
      session.setAttribute(userIDKey, userID);
      session.setAttribute(visitCountKey,  visitCount);
   } else {
       visitCount = (Integer)session.getAttribute(visitCountKey);
       visitCount += 1;
       userID = (String)session.getAttribute(userIDKey);
       session.setAttribute(visitCountKey,  visitCount);
   }
%>
<html>
<head>
<title>세션 추적</title>
</head>
<body>
<h1>세션 추적</h1>
<table border="1" align="center"> 
<tr bgcolor="#949494">
   <th> 세션 정보</th>
   <th> 값</th>
</tr> 
<tr>
   <td> id</td>
   <td><% out.print( session.getId()); %></td>
</tr> 
<tr>
   <td> 생성 시간</td>
   <td><% out.print(createTime); %></td>
</tr> 
<tr>
   <td> 마지막 접근 시간</td>
   <td><% out.print(lastAccessTime); %></td>
</tr> 
<tr>
   <td> 사용자 ID</td>
   <td><% out.print(userID); %></td>
</tr> 
<tr>
   <td> 방문 횟수</td>
   <td><% out.print(visitCount); %></td>
</tr> 
</table> 
</body>
</html>

시도하여 접근하세요 http://localhost:8080/testjsp/main.jsp 처음 실행할 때는 다음과 같은 결과를 얻을 것입니다:

다시 방문하면 다음과 같은 결과를 얻을 것입니다:

세션 데이터 지우기

사용자의 세션 데이터를 처리한 후에는 다음과 같은 선택을 할 수 있습니다:

  • 특정 속성을 제거하기:

    public void removeAttribute(String name) 메서드를 호출하여 지정된 속성을 제거합니다.

  • 전체 세션을 지우기:

    public void invalidate() 메서드를 호출하여 전체 세션을 무효화합니다.

  • 세션 유효 기간 설정:

    public void setMaxInactiveInterval(int interval) 메서드를 호출하여 세션 타임아웃을 설정합니다.

  • 사용자 로그아웃:

    서블릿을 지원합니다2.4버전의 서버는 logout() 메서드를 호출하여 사용자를 로그아웃하고 모든 관련 세션을 무효화할 수 있습니다.

  • web.xml 파일을 설정하다:

    Tomcat을 사용하는 경우 다음과 같이 web.xml 파일을 설정할 수 있습니다:

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

타임아웃은 분으로 단위로, Tomcat의 기본 타임아웃 시간은3분입니다.

Servlet의 getMaxInactiveInterval() 메서드는 초로 단위로 타임아웃 시간을 반환합니다. web.xml에서 설정된 값이15분이 지났다면 getMaxInactiveInterval() 메서드는900.