Servlet - problema com sessão

5 respostas
K

Saudações!

Pessoal, estou com dúvida sobre o tempo de uma sessão de usuário, em servlets/jsp…

A situação é a seguinte: abri o browser e realizei uma requisição, mapeando para um servlet (com setMaxInactiveInterval(120)), armazenado no tomcat; o servidor executou o processamento e retornou a resposta, dizendo que uma sessão fora criada (isNew()==true e id==xxx…). Até aí, tudo normal…

Agora, a dúvida é a seguinte: logo depois da requisição, referida acima, reiniciei o servidor tomcat, por completo, rapidamente e, antes de terminar o tempo de sessão (estipulado para 120 segundos), fiz uma nova requisição para o mesmo servlet e, para o meu espanto, o método “isNew()” do objeto de sessão retornou “false” e o id mostrado era o mesmo obtido antes de reiniciar o servidor.

Isso gerou-me um pouco de confusão, pois, como pode a sessão ter sido mantida, mesmo com o servidor tendo sido reiniciado? Coloquei um listener de contexto e até o contexto da app havia sido destruído…

Ficaria muito grato se alguém puder explicar-me porque isso aconteceu!

Kallás.

5 Respostas

J

A sessão ficou mantida serializada no diretório work (algum arquivo .ser)… Pra você ter conseguido recuperá-la provavelmente o tomcat estava colocando o jsessionid na url… Nunca me ‘atentei’ a isso, mas imagino que se isso chegou a ocorrer, essa explicação possa fazer algum sentido :slight_smile:

K

Olá jeveaux.
Primeiramente, obrigado pela atenção!

Sobre a questão do jsessionid, acredito que o servidor não tenha feito nada a esse respeito, pois, conferi a url e o cabeçalho e realmente não vi nada parecido.

Sobre a serialização, se não estou enganado, quando o servidor serializa uma sessão, obrigatoriamente, os métodos de ativação (sessionDidActivate) e passivação (sessionWillPassivate) são chamados. Mas, também implementei esses métodos, para conferir, e eles não foram chamados pelo container em nenhum momento.

Ainda continuo encabulado com isso.

Valeu.
Kallás.

K

Informação extra:

Realmente, o servidor serializou a sessão para um arquivo (no diretório work) chamado “SESSIONS.ser”. Mas, ainda estou com dúvida sobre por que o servidor, em vez de serializar a sessão, não destruiu a mesma, já que eu havia parado o servidor.

Obrigado.
Kallás.

J

Verifique no arquivo server.xml qual o gerenciador de sessões o Tomcat está usando, deve estar algo assim:

<Manager className="org.apache.catalina.session.StandardManager">

Ou

<Manager className="org.apache.catalina.session.PersistentManager">

Veja qual a classe está sendo usada.

Se estiver usando o gerenciador PersistentManager, ele mantem as sessões quando o tomcat é reiniciado, se não quer esse comportamento mude para o Standard.

K

Pessoal,
com a ajuda de vocês, está esclarecida essa dúvida!

A experiência que tive foi a seguinte: se não há nenhuma outra circunstância que eu desconheça, o padrão do Tomcat é o de serializar os objetos de sessão, de um contexto, sempre que o servidor é desligado (ou reiniciado). Visto isso, e com a ajuda dos colegas da comunidade, a questão da serialização automática foi resolvida colocando-se a tag <Manager className> dentro da tag de contexto, relativa a uma aplicação. Fazendo isso, os objetos de sessão, do contexto que contiver a tag <Manager className>, poderão ou não ser serializados, dependendo da classe gerenciadora (StandardManager ou PersistentManager) utilizada, como comentou “jairelton”.

Só para completar a informação, a configuração que utilizei foi esta (e os objetos de sessão passaram a não ser serializados):

&lt;Context path="/teste" reloadable="true" docBase="C:\TecnologiaJava\workspace3.3\TomcatTestes\web" 
               workDir="C:\TecnologiaJava\workspace3.3\TomcatTestes\work" &gt;
     &lt;Logger className="org.apache.catalina.logger.SystemOutLogger" verbosity="4" timestamp="true"/&gt;
	
     &lt;Manager className="org.apache.catalina.session.PersistentManager"
    	  	    debug="0"
                    saveOnRestart="false"
                    maxActiveSessions="-1"
                    minIdleSwap="-1"
                    maxIdleSwap="-1"
                    maxIdleBackup="-1"&gt;
          &lt;Store className="org.apache.catalina.session.FileStore"/&gt;
     &lt;/Manager&gt;
&lt;/Context&gt;

Enfim, obrigado pela ajuda, moçada! Até mais.

Kallás.

Criado 21 de abril de 2008
Ultima resposta 29 de abr. de 2008
Respostas 5
Participantes 3