HTTP는 상태 비저장 프로토콜입니다. 즉, 클라이언트가 웹 페이지를 검색할 때마다 별도의 서버 연결이 열리므로 서버는 이전 클라이언트 요청의 정보를 기록하지 않습니다.
클라이언트-서버 세션을 유지하는 방법에는 세 가지가 있습니다.
웹 서버는 고유한 세션 ID를 쿠키로 할당하여 각 클라이언트를 나타내고 해당 클라이언트의 후속 요청을 식별할 수 있습니다.
이는 브라우저가 반드시 쿠키를 지원하지 않는 경우가 많기 때문에 효율적인 방법이 아닐 수 있으므로 세션을 유지하기 위해 이 방법을 사용하지 않는 것이 좋습니다.
웹 서버는 다음과 같이 숨겨진 HTML 양식 필드와 고유 세션 ID를 보낼 수 있습니다.
<input type="hidden" name="sessionid" value="12345">
이 항목은 양식이 제출될 때 지정된 이름과 값이 자동으로 GET 또는 POST 데이터에 포함됨을 의미합니다. 브라우저가 요청을 보낼 때마다 session_id 값을 사용하여 다양한 브라우저의 추적을 저장할 수 있습니다.
이 접근 방식은 효율적인 접근 방식일 수 있지만 <A HREF> 태그의 하이퍼링크를 클릭하면 양식 제출 이벤트가 생성되지 않으므로 숨겨진 양식 필드는 범용 세션 추적을 지원하지 않습니다.
세션을 구별하기 위해 각 URL 뒤에 몇 가지 추가 데이터를 추가할 수 있으며, 서버는 이 데이터를 기반으로 세션 식별자를 연결할 수 있습니다.
예를 들어 http://w3cschool.cn/file.htm;sessionid=12345, 세션 식별자는 sessionid=12345이고 서버는 이 데이터를 사용하여 클라이언트를 식별할 수 있습니다.
이에 비해 URL을 다시 작성하는 것이 더 좋은 방법이고 브라우저가 쿠키를 지원하지 않아도 작동하지만, 간단한 HTML 페이지라도 URL마다 세션 ID를 동적으로 지정해야 한다는 단점이 있습니다.
위의 방법 외에도 JSP는 서블릿에서 제공하는 HttpSession 인터페이스를 사용하여 사용자를 식별하고 해당 사용자의 모든 액세스 정보를 저장합니다.
기본적으로 JSP는 세션 추적을 허용하며 새 HttpSession 객체는 새 클라이언트에 대해 자동으로 인스턴스화됩니다. 세션 추적을 비활성화하려면 명시적으로 비활성화해야 하며, 이는 다음과 같이 페이지 지시문의 세션 속성 값을 false로 설정하여 수행됩니다.
<%@ 페이지 세션="false" %>
JSP 엔진은 기본 세션 객체를 개발자에게 공개합니다. 세션 객체가 제공되므로 개발자가 쉽게 데이터를 저장하거나 검색할 수 있습니다.
다음 표에는 세션 개체의 몇 가지 중요한 메서드가 나열되어 있습니다.
SN | 방법 및 설명 |
---|---|
1 | public Object getAttribute(String name)는 세션 객체의 지정된 이름에 바인딩된 객체를 반환하거나 존재하지 않는 경우 null을 반환합니다. |
2 | public Enumeration getAttributeNames()는 세션 객체의 모든 객체 이름을 반환합니다. |
3 | public long getCreationTime()은 1970년 1월 1일 이른 아침부터 세션 객체가 생성된 시간을 밀리초 단위로 반환합니다. |
4 | public String getId()는 세션 객체의 ID를 반환합니다. |
5 | public long getLastAccessedTime()은 1970년 1월 1일 이른 아침부터 클라이언트의 마지막 액세스 시간을 밀리초 단위로 반환합니다. |
6 | public int getMaxInactiveInterval()은 서블릿 컨테이너가 세션을 열린 상태로 유지하는 최대 시간 간격(초)을 반환합니다. |
7 | public voidvalidate()는 세션을 무효화하고 세션에 바인딩된 모든 개체를 바인딩 해제합니다. |
8 | public boolean isNew( 새 클라이언트인지 또는 클라이언트가 세션 참여를 거부하는지 여부를 반환합니다. |
9 | public void RemoveAttribute(String name)는 세션에서 지정된 이름을 가진 객체를 제거합니다. |
10 | public void setAttribute(String name, Object value)는 지정된 이름과 값을 사용하여 객체를 생성하고 이를 세션에 바인딩합니다. |
11 | public void setMaxInactiveInterval(int Interval) 은 서블릿 컨테이너가 세션을 유효하게 유지하는 시간(초)을 지정하는 데 사용됩니다. |
이 예에서는 HttpSession 개체를 사용하여 생성 시간과 마지막 액세스 시간을 얻는 방법을 설명합니다. 요청 객체가 아직 존재하지 않는 경우 새 세션 객체를 요청 객체와 연관시킵니다.
<%@ page import="java.io.*,java.util.*" %><% // 세션 생성 시간 가져오기 Date createTime = new Date(session.getCreationTime()) // 세션 생성 시간 가져오기; 마지막 페이지 방문 날짜 lastAccessTime = new Date(session.getLastAccessedTime()); String title = "내 웹사이트에 오신 것을 환영합니다." Integer VisitCount = new 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); (Integer)session.getAttribute(visitCountKey); VisitCount = VisitCount + 1; userID = (String)session.getAttribute(userIDKey); session.setAttribute(visitCountKey, VisitCount) %><html><head><title> </title></head><body><center><h1>세션 추적</h1></center><table 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/main.jsp에 액세스해 보십시오. 처음 실행하면 다음과 같은 결과가 나타납니다.
다시 방문하면 다음과 같은 결과를 얻을 수 있습니다.
사용자의 세션 데이터를 처리한 후 다음 옵션을 사용할 수 있습니다.
특정 속성을 제거합니다.
지정된 속성을 제거하려면 public void RemoveAttribute(String name) 메소드를 호출하십시오.
전체 세션을 삭제합니다.
전체 세션을 무효화하려면 public voidvalidate() 메서드를 호출하세요.
세션 유효 기간 설정:
세션 시간 제한을 설정하려면 public void setMaxInactiveInterval(int 간격) 메서드를 호출하세요.
로그아웃 사용자:
서블릿 버전 2.4를 지원하는 서버는 logout() 메서드를 호출하여 사용자를 로그아웃하고 모든 관련 세션을 무효화할 수 있습니다.
web.xml 파일을 구성합니다.
Tomcat을 사용하는 경우 web.xml 파일을 다음과 같이 구성할 수 있습니다.
<session-config> <session-timeout>15</session-timeout> </session-config>
시간 초과는 분 단위이며 Tomcat의 기본 시간 초과는 30분입니다.
Servlet의 getMaxInactiveInterval() 메소드는 시간 초과를 초 단위로 반환합니다. web.xml에 15분이 구성된 경우 getMaxInactiveInterval() 메서드는 900을 반환합니다.