Pergunta

Sou novo no JEE e é isso que me confunde.De acordo com HttpSession.html#setMaxInactiveInterval(intervalo interno) documentação

Um interval valor de zero 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.

Foi útil?

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 subelemento session-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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top