CodeGym /Cursos /All lectures for PT purposes /Trabalhando com Sessões Servlet

Trabalhando com Sessões Servlet

All lectures for PT purposes
Nível 1, Lição 382
Disponível

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();
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION