Confusão de tempo limite da sessão - session.setMaxInactiveInterval(0)
-
26-12-2019 - |
Pergunta
Sou novo no JEE e é isso que me confunde.De acordo com HttpSession.html#setMaxInactiveInterval(intervalo interno) documentação
Um
interval
valor dezero
ou menos indica que o a sessão nunca deve expirar.
mas de acordo com meu livro (que já tem alguns anos - então espero que nem sempre esteja certo), usar zero como argumento deve fazer com que a sessão expire imediatamente.
Este código
public class Test extends HttpServlet {
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
HttpSession session = request.getSession();
session.setAttribute("foo", 42);
session.setMaxInactiveInterval(0);
out.println(session.getAttribute("foo"));//problem here
}
}
usado no Glassfish 4.0 parece confirmar a teoria do livro didático em vez da documentação oficial mais recente porque retorna Status HTTP 500 - Erro interno do servidor com mensagem de erro
java.lang.IllegalStateException: getAttribute: Session already invalidated
O que está acontecendo aqui?Este bug do Glassfish 4.0 ou a documentação está errada?Ou talvez haja uma terceira opção?
PS.Este código funciona como deveria com valores negativos (a sessão não é invalidada) e estou usando -1
em vez de 0
no meu código.Estou apenas interessado no que há de errado com 0
.
Solução
O Especificação de servlet capítulo sobre estados de tempo limite de sessão
Por definição, se o período de tempo limite para uma sessão estiver definido como -1, a sessão nunca expirará.
Então GlasshFish parece ter isso coberto.Não consigo encontrar nenhuma referência na especificação que diga que o mesmo deveria ser verdade para um valor de 0
com setMaxInactiveInterval()
.No entanto, diz
O
session-config
Define os parâmetros da sessão para este aplicativo da Web.O subelementosession-timeout
Define o intervalo de tempo limite da sessão padrão para todas as sessões criadas neste aplicativo da web.O tempo limite especificado deve ser expresso em um número inteiro de minutos. Se o tempo limite for 0 ou menos, o contêiner garante que o comportamento padrão das sessões nunca seja um tempo para passar.Se esse elemento não for especificado, o contêiner deve definir seu período de tempo limite padrão.
Outras dicas
Isso já expirou e invalida
session.setMaxInactiveInterval(0); // mean inactive immediately
Portanto, esta é a mensagem de erro correta.(consulte o livro primeiro para referência adicional.)
Você está tentando acessar o valor do objeto que não existe.já está destruído