4.1 Introdução ao HttpSession

Se vários pedidos vierem do mesmo cliente, eles dizem que uma sessão foi estabelecida entre o cliente e o servidor. Para controlar esse processo, o contêiner possui um objeto especial HttpSession.

Quando um cliente faz uma solicitação para um servlet, o contêiner do servlet verifica se o parâmetro ID da sessão está presente na solicitação. Se não houver esse parâmetro (por exemplo, o cliente está entrando em contato com o servidor pela primeira vez), o contêiner do servlet cria um novo objeto HttpSession e também atribui a ele um ID exclusivo.

O objeto de sessão é armazenado no servidor e o ID é enviado em resposta ao cliente e, por padrão, é armazenado no cliente em um cookie. Então, quando uma nova solicitação chega do mesmo cliente, o contêiner do servlet recupera o ID dele e, por meio desse ID, localiza o objeto HttpSession correto no servidor.

Você pode obter o objeto de sessão de uma solicitação (um objeto HttpServletRequest), no qual você precisa chamar o método getSession(). Ele retorna um objeto HttpSession.

Por que uma sessão é necessária? Ele pode armazenar informações sobre o cliente entre as chamadas. Ela tem algo como um HashMap dentro, no qual você pode armazenar objetos por chaves. E alguns métodos para isso:

Métodos Descrição
1 setAttribute(String name, Object o) Adiciona um objeto à sessão
2 getAttribute(String name) Obtém um objeto da sessão
3 removeAttribute(String name) Remove um objeto da sessão

Vamos escrever um servlet que irá somar todos os números passados ​​para ele a partir de diferentes requisições:

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 Mais sobre HttpSession

Há mais alguma coisa que não dissemos sobre o objeto HttpSession?

Primeiro, é o nome J SESSION ID. É sob ele que o ID da sessão é armazenado em cookies. Como você pode ver, é bem fácil de lembrar: J+SESSION+ID.

Em segundo lugar, a sessão tem mais alguns métodos úteis:

Métodos Descrição
1 getAttributeNames() Retorna uma lista de todas as chaves armazenadas na sessão
2 getId() Retorna o ID da sessão (string)
3 isNew() Retorna verdadeiro se o objeto de sessão foi criado na solicitação atual
4 setMaxInactiveInterval(int seconds) Define o intervalo de inatividade da sessão em segundos
5 invalidate() Remove todos os objetos da sessão

Aqui todos os métodos são óbvios, mas setMaxInactiveInterval()falaremos um pouco mais.

Se o servidor armazenar dezenas de milhares de sessões, incluindo os dados dos clientes que o visitaram no mês passado, ele simplesmente ficará sem memória. Portanto, existe uma maneira de definir o “tempo de vida da sessão”.

Se ninguém usou a sessão por um intervalo de tempo, ela se limpa - todos os objetos que ela armazenou são excluídos dela. Isso é feito para economizar memória.

Por padrão, esse intervalo é de 1800 segundos == 30 minutos. Se você definir o valor como -1, a sessão será "eterna" e será excluída apenas quando o usuário fechar a guia do navegador (bem, ou o cliente for desconectado).

Exemplos:

// 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();