JSP 세션


HTTP는 상태 비저장 프로토콜입니다. 즉, 클라이언트가 웹 페이지를 검색할 때마다 별도의 서버 연결이 열리므로 서버는 이전 클라이언트 요청의 정보를 기록하지 않습니다.

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


쿠키

웹 서버는 고유한 세션 ID를 쿠키로 할당하여 각 클라이언트를 나타내고 이를 사용하여 이 클라이언트의 후속 요청을 식별할 수 있습니다.

이 방법은 브라우저가 반드시 쿠키를 지원하지 않는 경우가 많기 때문에 효율적인 방법이 아닐 수 있으므로 세션 유지를 위해 이 방법을 사용하지 않는 것이 좋습니다.


숨겨진 양식 필드

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

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

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

이 접근 방식은 효율적인 접근 방식일 수 있지만 <A HREF> 태그의 하이퍼링크를 클릭하면 양식 제출 이벤트가 생성되지 않으므로 숨겨진 양식 필드는 범용 세션 추적을 지원하지 않습니다.


URL 재작성

각 URL 뒤에 추가 데이터를 추가하여 세션을 구분할 수 있으며, 서버는 이 데이터를 기반으로 세션 식별자를 연결할 수 있습니다.

예를 들어 http://w3cschool.cc/file.htm;sessionid=12345, 세션 식별자는 sessionid=12345, 서버는 이 데이터를 사용하여 클라이언트를 식별할 수 있습니다. <… 간단한 HTML 페이지.

세션 객체

JSP는 위의 메소드 외에도 서블릿에서 제공하는 HttpSession 인터페이스를 사용하여 사용자를 식별하고 해당 사용자의 모든 액세스 정보를 저장합니다.

기본적으로 JSP는 세션 추적을 허용하며 새 HttpSession 객체는 새 클라이언트에 대해 자동으로 인스턴스화됩니다. 세션 추적을 비활성화하려면 명시적으로 비활성화해야 하며, 이는 다음과 같이 페이지 지시문의 세션 속성 값을 false로 설정하여 수행됩니다.

<%@ page session="false" %>

JSP 엔진은 암시적 세션 개체를 개발자에게 노출합니다. 세션 객체가 제공되므로 개발자가 쉽게 데이터를 저장하거나 검색할 수 있습니다.

다음 표에는 세션 개체의 몇 가지 중요한 메서드가 나열되어 있습니다.

S.N.메서드 1public Object getAttribute(문자열 이름)
설명

세션 개체에 지정된 이름에 바인딩된 개체를 반환합니다. 개체가 없으면 null

을 반환합니다. 2공개 열거형 getAttributeNames()


세션 개체
에 있는 모든 개체 이름을 반환합니다. 3공개 긴 getCreationTime()


1970년 1월 1일 이른 아침부터 세션 개체가 생성된 시간을 밀리초 단위로 반환합니다.
4공개 문자열 getId()


세션 개체의 ID를 반환합니다
5공개 긴 getLastAccessedTime()


1970년 1월 1일 이른 아침부터 클라이언트의 마지막 액세스 시간을 밀리초 단위로 반환합니다.
6공용 int getMaxInactiveInterval()


서블릿 컨테이너가 세션을 열린 상태로 유지하는 최대 시간 간격(초)을 반환합니다.
7공용 무효화()


세션을 무효화하고 세션에 바인딩된 모든 개체를 바인딩 해제합니다.
8공개 부울 isNew(


신규 클라이언트인지, 클라이언트가 세션 참여를 거부하는지 여부를 반환합니다
9public void RemoveAttribute(문자열 이름)


세션
에서 지정된 이름을 가진 개체를 제거합니다. 10public void setAttribute(문자열 이름, 개체 값)


지정된 이름과 값을 사용하여 개체를 생성하고 세션에 바인딩합니다
11public void setMaxInactiveInterval(int 간격)


서블릿 컨테이너가 세션을 유효한 상태로 유지하는 시간(초)을 지정하는 데 사용됩니다.

JSP 세션 애플리케이션

이 예제에서는 HttpSession 객체를 사용하여 생성 시간과 마지막 액세스 시간을 가져오는 방법을 설명합니다. 요청 객체가 아직 존재하지 않는 경우 새 세션 객체를 요청 객체와 연관시킵니다.

<%@ 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 = "再次访问php中文网实例";
   Integer visitCount = new Integer(0);
   String visitCountKey = new String("visitCount");
   String userIDKey = new String("userID");
   String userID = new String("ABCD");

   // 检测网页是否由新的访问用户
   if (session.isNew()){
      title = "访问php中文网实例";
      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>Session 跟踪</title>
</head>
<body>

<h1>Session 跟踪</h1>

<table border="1" align="center"> 
<tr bgcolor="#949494">
   <th>Session 信息</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에 접속해 처음 실행하면 다음과 같은 결과가 나옵니다.

sessjsp1.jpg

다시 방문하시면 다음과 같은 결과가 나옵니다.

sessjsp2.jpg


세션 데이터 삭제

사용자의 세션 데이터가 처리되면 마지막으로 다음과 같은 선택이 가능합니다:

  • 특정 속성 제거:

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

  • 전체 세션 삭제:

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

  • 세션 유효 기간 설정:

    공개 void setMaxInactiveInterval(int 간격) 메서드를 호출하여 세션 시간 초과를 설정합니다.

  • 사용자 로그아웃:

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

  • web.xml 파일 구성:

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

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

제한 시간은 다음과 같습니다. 분, Tomcat의 기본 시간 제한은 30분입니다.

서블릿의 getMaxInactiveInterval() 메서드는 시간 초과를 초 단위로 반환합니다. web.xml에 15분이 구성된 경우 getMaxInactiveInterval() 메서드는 900을 반환합니다.