4.1 HttpSession 소개

동일한 클라이언트에서 여러 요청이 오면 클라이언트와 서버 간에 세션이 설정되었다고 말합니다. 이 프로세스를 제어하기 위해 컨테이너에는 특수한 HttpSession 개체가 있습니다.

클라이언트가 서블릿에 요청하면 서블릿 컨테이너는 요청에 세션 ID 매개변수가 있는지 확인합니다. 그러한 매개 변수가 없으면(예를 들어 클라이언트가 처음으로 서버에 연결하는 경우) 서블릿 컨테이너는 새 HttpSession 개체를 만들고 고유한 ID를 할당합니다.

세션 개체는 서버에 저장되고 ID는 클라이언트에 대한 응답으로 전송되며 기본적으로 클라이언트의 쿠키에 저장됩니다. 그런 다음 동일한 클라이언트에서 새 요청이 들어오면 서블릿 컨테이너는 ID를 검색하고 해당 ID로 서버에서 올바른 HttpSession 개체를 찾습니다.

getSession() 메서드를 호출해야 하는 요청(HttpServletRequest 객체)에서 세션 객체를 가져올 수 있습니다. HttpSession 개체를 반환합니다.

세션이 필요한 이유는 무엇입니까? 호출 사이에 클라이언트에 대한 정보를 저장할 수 있습니다. 그녀는 키로 개체를 저장할 수 있는 HashMap과 같은 것을 내부에 가지고 있습니다. 그리고 이를 위한 몇 가지 방법:

행동 양식 설명
1 setAttribute(String name, Object o) 세션에 개체를 추가합니다.
2 getAttribute(String name) 세션에서 객체를 가져옵니다.
removeAttribute(String name) 세션에서 개체를 제거합니다.

서로 다른 요청에서 전달된 모든 숫자를 합산하는 서블릿을 작성해 보겠습니다.

public class CalculatorServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
         // Get the "sum" attribute from the session
        HttpSession session = request.getSession();
        Integer sum = (Integer) session.getAttribute("sum");
        //Handling the situation when the session does not yet have such an attribute
        if (sum == null)
            sum = 0;

         // Get the "n" parameter from the request
        String n = request.getParameter("n");
        sum += Integer.parseInt(n);

         // Write the "sum" attribute to the session
        session.setAttribute("sum", sum);

        // Print the HTML as a response to the browser
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head> <title> CalculatorServlet </title> </head>");
        out.println("<body>");
        out.println("<h1> Sum == " + sum + "</h1>");
        out.println("</body>");
        out.println("</html>");
    }
}

4.2 HttpSession에 대한 추가 정보

HttpSession 개체에 대해 언급하지 않은 다른 사항이 있습니까?

먼저 이름은 J SESSION ID입니다. 그 아래에 세션 ID가 쿠키에 저장됩니다. 보시다시피 기억하기가 매우 쉽습니다. J+SESSION+ID.

둘째, 세션에는 몇 가지 더 유용한 방법이 있습니다.

행동 양식 설명
1 getAttributeNames() 세션에 저장된 모든 키 목록을 반환합니다.
2 getId() 세션 ID(문자열)를 반환합니다.
isNew() 세션 개체가 현재 요청에서 생성된 경우 true를 반환합니다.
4 setMaxInactiveInterval(int seconds) 세션 비활성 간격을 초 단위로 설정합니다.
5 invalidate() 세션에서 모든 개체를 제거합니다.

여기서 모든 방법은 분명하지만 setMaxInactiveInterval()조금 더 이야기하겠습니다.

지난 달 방문한 클라이언트의 데이터를 포함하여 서버가 수만 개의 세션을 저장하면 단순히 메모리가 부족합니다. 따라서 "세션 수명"을 설정하는 방법이 있습니다.

일정 시간 동안 아무도 세션을 사용하지 않으면 자체적으로 지워집니다. 저장된 모든 객체가 삭제됩니다. 이것은 메모리를 절약하기 위해 수행됩니다.

기본적으로 이 간격은 1800초 == 30분입니다. 값을 -1로 설정하면 세션이 "영구적"이 되며 사용자가 브라우저 탭을 닫을 때만(또는 클라이언트 연결이 끊김) 삭제됩니다.

예:

// get all keys
Enumeration keys = session.getAttributeNames();
while( keys.hasMoreElements() ){
    System.out.println( (String) keys.nextElement() );
}
// set the inactivity interval
session.setMaxInactiveInterval(60*60*24);   // 1 day
session.setMaxInactiveInterval(-1); // until the browser is closed
// remove all data from the session
session.invalidate();