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:
|
|
|
GO TO FULL VERSION