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 엔진은 암시적 세션 개체를 개발자에게 노출합니다. 세션 객체가 제공되므로 개발자가 쉽게 데이터를 저장하거나 검색할 수 있습니다.
다음 표에는 세션 개체의 몇 가지 중요한 메서드가 나열되어 있습니다.
메서드 | 및 설명 |
---|---|
public Object getAttribute(문자열 이름) | 세션 개체에 지정된 이름에 바인딩된 개체를 반환합니다. 개체가 없으면 null |
을 반환합니다. 2 | 공개 열거형 getAttributeNames() |
에 있는 모든 개체 이름을 반환합니다. 3 | 공개 긴 getCreationTime() |
4 | 공개 문자열 getId() |
5 | 공개 긴 getLastAccessedTime() |
6 | 공용 int getMaxInactiveInterval() |
7 | 공용 무효화() |
8 | 공개 부울 isNew( |
9 | public void RemoveAttribute(문자열 이름) |
에서 지정된 이름을 가진 개체를 제거합니다. 10 | public void setAttribute(문자열 이름, 개체 값) |
11 | public 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에 접속해 처음 실행하면 다음과 같은 결과가 나옵니다.
다시 방문하시면 다음과 같은 결과가 나옵니다.
세션 데이터 삭제
사용자의 세션 데이터가 처리되면 마지막으로 다음과 같은 선택이 가능합니다:
특정 속성 제거:
공용 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을 반환합니다.