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

Servlet 세션 추적

HTTP는 "상태 없는" 프로토콜로, 이는 클라이언트가 웹 페이지를 검색할 때마다 클라이언트가 웹 서버로 단일 연결을 열고, 서버는 이전 클라이언트 요청의 기록을 자동으로 유지하지 않음을 의미합니다。

하지만 여전히 Web 클라이언트와 Web 서버 간의 세션 세션을 유지하는 세 가지 방법이 있습니다:

Cookies

一个 Web 服务器可以分配一个唯一的 session 会话 ID 作为每个 Web 客户端的 cookie,对于客户端的后续请求可以使用接收到的 cookie 来识别。

这可能不是一个有效的方法,因为很多浏览器不支持 cookie,所以我们建议不要使用这种方式来维持 session 会话。

隐藏的表单字段

一个 Web 服务器可以发送一个隐藏的 HTML 表单字段,以及一个唯一的 session 会话 ID,如下所示:

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

该条目意味着,当表单被提交时,指定的名称和值会被自动包含在 GET 或 POST 数据中。每次当 Web 浏览器发送回请求时,session_id 值可以用于保持不同的 Web 浏览器的跟踪。

这可能是一种保持 session 会话跟踪的有效方式,但是点击常规的超文本链接(<A HREF...>)不会导致表单提交,因此隐藏的表单字段也不支持常规的 session 会话跟踪。

URL 重写

您可以在每个 URL 末尾追加一些额外的数据来标识 session 会话,服务器会把该 session 会话标识符与已存储的有关 session 会话的数据相关联。

例如,http://oldtoolbag.com/file.htm;sessionid=12345,session 会话标识符被附加为 sessionid=12345,标识符可被 Web 服务器访问以识别客户端。

URL 重写是一种更好的维持 session 会话的方式,它在浏览器不支持 cookie 时能够很好地工作,但是它的缺点是会动态生成每个 URL 来为页面分配一个 session 会话 ID,即使是在很简单的静态 HTML 页面中也会如此。

HttpSession 对象

除了上述的三种方式,Servlet 还提供了 HttpSession 接口,该 interface 提供了一种跨多个页面请求或访问网站时识别用户以及存储有关用户信息的方式。

Servlet 容器使用这个 interface 来创建一个 HTTP 客户端和 HTTP 服务器之间的 session 会话。会话持续一个指定的时间段,跨多个连接或页面请求。

您 will 通过调用 HttpServletRequest 的 public method getSession()} HttpSession 객체를 얻기 위해 다음과 같이 호출합니다:

HttpSession session = request.getSession();

클라이언트에게 어떤 문서 내용도 보내기 전에 호출해야 합니다. request.getSession()아래는 HttpSession 객체에서 사용할 수 있는 몇 가지 중요한 메서드를 요약합니다:

순번메서드 & 설명
1public Object getAttribute(String name)
이 방법은 해당 세션 세션에서 지정된 이름의 객체를 반환합니다. 지정된 이름의 객체가 없다면 null을 반환합니다.
2public Enumeration getAttributeNames()
이 방법은 해당 세션 세션에 바인딩된 모든 객체의 이름을 포함한 String 객체의 열거형을 반환합니다.
3public long getCreationTime()
이 방법은 해당 세션 세션이 생성된 시간을 그린니치 표준 시간에서 반환합니다. 1970 년 1 월 1 일午夜에서 시작하여 밀리초 단위로 계산됩니다.
4public String getId()
이 방법은 해당 세션 세션에 할당된 유일한 식별자를 포함한 문자열을 반환합니다.
5public long getLastAccessedTime()
이 방법은 클라이언트가 해당 세션 세션과 관련된 마지막 요청을 보낸 시간을 그린니치 표준 시간에서 반환합니다. 1970 년 1 월 1 일午夜에서 시작하여 밀리초 단위로 계산됩니다.
6public int getMaxInactiveInterval()
이 방법은 클라이언트가 접근할 때 Servlet 컨테이너가 세션 세션을 열어둘 수 있는 최대 시간 간격을 초 단위로 반환합니다.
7public void invalidate()
이 방법은 해당 세션 세션이 무효가 되고, 그에 바인딩된 모든 객체를 해제합니다.
8public boolean isNew()
클라이언트가 해당 세션 세션을 알지 못하거나, 고객이 세션 세션에 참여하지 않기를 원한다면 이 방법은 true를 반환합니다.
9public void removeAttribute(String name)
이 방법은 지정된 이름의 객체를 해당 세션 세션에서 제거합니다.
10public void setAttribute(String name, Object value)
이 방법은 지정된 이름으로 객체를 해당 세션 세션에 바인딩합니다.
11public void setMaxInactiveInterval(int interval)
이 방법은 Servlet 컨테이너가 해당 세션 세션을 무효로 선언하기 전까지 클라이언트 요청 간의 시간을 초 단위로 지정합니다.

Session 추적 예제

이 예제는 HttpSession 객체를 사용하여 session 세션 생성 시간과 마지막 접근 시간을 가져오는 방법을 설명합니다. session 세션이 없으면, 요청을 통해 새로운 session 세션이 생성됩니다.

package com.w3codebox.test;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
 * Servlet 구현 클래스 SessionTrack
 */
@WebServlet("/SessionTrack)
public class SessionTrack extends HttpServlet {
    private static final long serialVersionUID = 1L;
    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());
         
        //날짜 출력 형식 설정  
        SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
    
        String title = "Servlet Session 예제 - 기본 지침 웹사이트";
        Integer visitCount = new Integer(0);
        String visitCountKey = new String("visitCount");
        String userIDKey = new String("userID");
        String userID = new String("w3codebox");
        if(session.getAttribute(visitCountKey) == null) {
            session.setAttribute(visitCountKey, new Integer(0));
        }
    
        // 웹 페이지에 새로운 방문자가 있는지 확인
        if (session.isNew()){
            title = "Servlet Session 예제 - 기본 지침 웹사이트";
             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;charset=UTF-8");
        PrintWriter out = response.getWriter();
    
        String docType = "<!DOCTYPE html>\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\">세션 정보</h2>\n" +
                "<table border=\"1\" align=\"center\">\n" +
                "<tr bgcolor=\"#949494\">\n" +
                "  <th>세션 정보</th><th>값</th></tr>\n" +
                "<tr>\n" +
                "  <td>id</td>\n" +
                "  <td>" + session.getId() + "</td></tr>\n" +
                "<tr>\n" +
                "  <td>생성 시간</td>\n" +
                "  <td>" +  df.format(createTime) + 
                "  </td></tr>\n" +
                "<tr>\n" +
                "  <td>최근 접근 시간</td>\n" +
                "  <td>" + df.format(lastAccessTime) + 
                "  </td></tr>\n" +
                "<tr>\n" +
                "  <td>사용자 ID</td>\n" +
                "  <td>" + userID + 
                "  </td></tr>\n" +
                "<tr>\n" +
                "  <td>방문 통계:</td>\n" +
                "  <td>" + visitCount + "</td></tr>\n" +
                "</table>\n" +
                "</body></html>"); 
    }
}

위의 Servlet을 컴파일합니다 SessionTrack웹.xml 파일에서 적절한 항목을 생성합니다。

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
  <servlet> 
    <!-- 클래스 이름 -->  
    <servlet-name>SessionTrack</servlet-name>
    <!-- 의 패키지 -->
    <servlet-class>com.w3codebox.test.SessionTrack</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>SessionTrack</servlet-name>
    <!-- 방문한 웹사이트 -->
    <url-pattern>/TomcatTest/SessionTrack</url-pattern>
  </servlet-mapping>
</web-app>

브라우저 주소 표시줄에 입력합니다 http://localhost:8080/TomcatTest/SessionTrack처음 실행할 때는 다음과 같은 결과가 표시됩니다:

동일한 Servlet을 다시 실행하면 다음과 같은 결과가 표시됩니다:

세션 세션 데이터를 삭제합니다

사용자의 세션 세션 데이터를 완료한 후, 다음과 같은 선택이 있습니다:

  • 특정 속성을 제거합니다:세션 세션 만료 시간을 설정하려면 다음 메서드를 호출할 수 있습니다: public void removeAttribute(String name) public void removeValue(String key)

  • 특정 키와 관련된 값을 제거하려면세션 세션 만료 시간을 설정하려면 다음 메서드를 호출할 수 있습니다: public void invalidate() 전체 세션 세션을 제거하려면

  • public void invalidate()세션 세션 만료 시간을 설정하려면 다음 메서드를 호출할 수 있습니다: public void setMaxInactiveInterval(int interval) 메서드를 사용하여 세션 세션 만료 시간을 단독으로 설정할 수 있습니다.

  • 사용자 로그아웃:servlet을 지원하는 2.4 서버에서, 다음을 호출할 수 있습니다. logout Web 서버의 클라이언트를 로그아웃하고 모든 사용자의 모든 세션 세션을 무효로 만드는 데 사용됩니다.

  • web.xml 설정:Tomcat을 사용하는 경우, 위 메서드 외에도 web.xml 파일에서 세션 세션 만료 시간을 설정할 수 있습니다. 예를 들어:

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

위 예제의 만료 시간은 분 단위로 설정되어 있으며, Tomcat의 기본 설정을 대체합니다. 30 분 만료 시간.

Servlet의 getMaxInactiveInterval() 메서드는 세션 세션의 만료 시간을 초 단위로 반환합니다. 따라서, web.xml에서 세션 세션 만료 시간을 설정하면 15 분이 지났다면, getMaxInactiveInterval()는 900.