서블릿 세션 추적
HTTP는 "상태 비저장" 프로토콜입니다. 즉, 클라이언트가 웹 페이지를 검색할 때마다 클라이언트는 웹 서버에 대한 별도의 연결을 열고 서버는 자동으로 이전 클라이언트를 유지하지 않습니다. 어떤 기록이든 요청하세요.
하지만 웹 클라이언트와 웹 서버 간의 세션을 유지하는 세 가지 방법이 있습니다.
쿠키
웹 서버는 각 웹 클라이언트에 고유한 세션 ID를 쿠키로 할당할 수 있으며, 클라이언트의 후속 요청은 수신된 쿠키를 사용하여 식별할 수 있습니다.
많은 브라우저가 쿠키를 지원하지 않기 때문에 이는 효율적인 방법이 아닐 수 있으므로 세션 유지를 위해 이 방법을 사용하지 않는 것이 좋습니다.
숨겨진 양식 필드
웹 서버는 다음과 같이 고유한 세션 ID와 함께 숨겨진 HTML 양식 필드를 보낼 수 있습니다.
<input type="hidden" name="sessionid" value="12345">
이 항목은 다음을 의미합니다. 양식이 제출되면 지정된 이름과 값이 GET 또는 POST 데이터에 자동으로 포함됩니다. session_id 값은 웹 브라우저가 요청을 다시 보낼 때마다 다른 웹 브라우저를 추적하는 데 사용될 수 있습니다.
이것은 세션을 추적하는 효과적인 방법일 수 있지만 일반 하이퍼텍스트 링크(<A HREF...>)를 클릭해도 양식이 제출되지 않으므로 숨겨진 양식도 제출되지 않습니다. 필드를 지원합니다. 일반 세션 추적.
URL 재작성
각 URL 끝에 추가 데이터를 추가하여 세션을 식별할 수 있으며, 서버는 세션 식별자를 세션에 대해 저장된 데이터와 연관시킵니다.
예를 들어 http://w3cschool.cc/file.htm;sessionid=12345의 경우 세션 식별자는 sessionid=12345로 추가되며 웹 서버에서 이 식별자에 액세스하여 클라이언트를 식별할 수 있습니다.
URL 재작성은 세션을 유지하는 더 좋은 방법입니다. 브라우저가 쿠키를 지원하지 않는 경우에도 잘 작동하지만, 각 URL이 페이지에 할당되기 위해 동적으로 생성된다는 점이 단점입니다. 매우 간단한 정적 HTML 페이지에서.
HttpSession 객체
위의 세 가지 방법 외에도 Servlet은 여러 페이지 요청이나 웹 사이트에 액세스할 때 사용자를 식별하고 사용자에 대한 정보를 저장하는 방법을 제공하는 HttpSession 인터페이스도 제공합니다. 방법.
서블릿 컨테이너는 이 인터페이스를 사용하여 HTTP 클라이언트와 HTTP 서버 간의 세션을 생성합니다. 세션은 지정된 기간 동안 지속되며 여러 연결 또는 페이지 요청에 걸쳐 있습니다.
아래와 같이 HttpServletRequest의 공개 메소드 getSession()을 호출하여 HttpSession 객체를 가져옵니다.
HttpSession session = request.getSession();
모든 문서 콘텐츠를 클라이언트에 보내야 합니다. request.getSession()을 호출하기 전에. 다음은 HttpSession 개체에서 사용할 수 있는 몇 가지 중요한 메서드를 요약한 것입니다.
序号 | 方法 & 描述 |
---|---|
1 | public Object getAttribute(String name) 该方法返回在该 session 会话中具有指定名称的对象,如果没有指定名称的对象,则返回 null。 |
2 | public Enumeration getAttributeNames() 该方法返回 String 对象的枚举,String 对象包含所有绑定到该 session 会话的对象的名称。 |
3 | public long getCreationTime() 该方法返回该 session 会话被创建的时间,自格林尼治标准时间 1970 年 1 月 1 日午夜算起,以毫秒为单位。 |
4 | public String getId() 该方法返回一个包含分配给该 session 会话的唯一标识符的字符串。 |
5 | public long getLastAccessedTime() 该方法返回客户端最后一次发送与该 session 会话相关的请求的时间自格林尼治标准时间 1970 年 1 月 1 日午夜算起,以毫秒为单位。 |
6 | public int getMaxInactiveInterval() 该方法返回 Servlet 容器在客户端访问时保持 session 会话打开的最大时间间隔,以秒为单位。 |
7 | public void invalidate() 该方法指示该 session 会话无效,并解除绑定到它上面的任何对象。 |
8 | public boolean isNew( 如果客户端还不知道该 session 会话,或者如果客户选择不参入该 session 会话,则该方法返回 true。 |
9 | public void removeAttribute(String name) 该方法将从该 session 会话移除指定名称的对象。 |
10 | public void setAttribute(String name, Object value) 该方法使用指定的名称绑定一个对象到该 session 会话。 |
11 | public void setMaxInactiveInterval(int interval) 该方法在 Servlet 容器指示该 session 会话无效之前,指定客户端请求之间的时间,以秒为单位。 |
세션 추적 예시
이 예시는 HttpSession 개체를 사용하여 세션 생성 시간과 마지막 액세스 시간을 얻는 방법을 보여줍니다. 세션이 존재하지 않으면 요청을 통해 새 세션을 생성합니다.
// 导入必需的 java 库 import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.util.*; // 扩展 HttpServlet 类 public class SessionTrack extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 如果不存在 session 会话,则创建一个 session 对象 HttpSession session = request.getSession(true); // 获取 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); } else { visitCount = (Integer)session.getAttribute(visitCountKey); visitCount = visitCount + 1; userID = (String)session.getAttribute(userIDKey); } session.setAttribute(visitCountKey, visitCount); // 设置响应内容类型 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 信息</h2>\n" + "<table border=\"1\" align=\"center\">\n" + "<tr bgcolor=\"#949494\">\n" + " <th>Session 信息</th><th>值</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>"); } }
위 서블릿 SessionTrack을 컴파일하고 web.xml 파일에 적절한 항목을 생성합니다. 브라우저 주소창에 http://localhost:8080/SessionTrack을 입력하면 처음 실행하면 다음과 같은 결과가 나옵니다.
Welcome to my 웹사이트
세션 정보
Session 信息 | 值 |
---|---|
id | 0AE3EC93FF44E3C525B4351B77ABB2D5 |
Creation Time | Tue Jun 08 17:26:40 GMT+04:00 2014 |
Time of Last Access | Tue Jun 08 17:26:40 GMT+04:00 2014 |
User ID | ABCD |
Number of visits | 0 |
동일한 서블릿을 다시 실행해 보면 다음과 같은 결과가 표시됩니다.
내 웹사이트에 다시 오신 것을 환영합니다
세션정보
Session 信息 | 值 |
---|---|
id | 0AE3EC93FF44E3C525B4351B77ABB2D5 |
Creation Time | Tue Jun 08 17:26:40 GMT+04:00 2014 |
Time of Last Access | Tue Jun 08 17:26:40 GMT+04:00 2014 |
User ID | ABCD |
Number of visits | 1 |
세션 데이터 삭제
사용자의 세션 데이터를 완료할 때 다음 옵션이 있습니다.
특정 세션 데이터 제거 속성: public void RemoveAttribute(String name) 메서드를 호출하여 특정 키와 연결된 값을 제거할 수 있습니다. 특정 키와 연결된 값을 삭제합니다.
전체 세션을 삭제합니다. public voidvalidate() 메서드를 호출하여 전체 세션 세션을 삭제합니다.
세션 만료 시간 설정: public void setMaxInactiveInterval(int Interval) 메서드를 호출하여 세션 시간 초과를 개별적으로 설정할 수 있습니다.
사용자 로그아웃: 서블릿 2.4를 지원하는 서버를 사용하는 경우 logout을 호출하여 클라이언트를 로그아웃할 수 있습니다. 웹 서버에 접속하고 모든 사용자에게 속한 모든 세션을 무효화합니다.
web.xml 구성: Tomcat을 사용하는 경우 위의 방법 외에도 web.xml 파일에서 세션 세션 시간 초과를 구성할 수도 있습니다. , 다음과 같이 표시:
<session-config> <session-timeout>15</session-timeout> </session-config>
위 예의 시간 제한은 분 단위이며 Tomcat의 기본 시간 제한인 30분을 재정의합니다.
서블릿의 getMaxInactiveInterval() 메소드는 세션 시간 초과를 초 단위로 반환합니다. 따라서 web.xml에서 세션 시간 초과가 15분으로 구성된 경우 getMaxInactiveInterval()은 900을 반환합니다.