Controle de Sessão

Salve Salve Galera!

Alguém sabe como faço para uma sessão expirar depois de X tempo?

Existe algum método que é chamado quando uma sessão expirou?

Atn.
Dennys Fredericci

no web.xml

    <session-config>
        <!-- 30 minutos -->
        <session-timeout>30</session-timeout>
    </session-config> 

pra invalidar uma sessão pode usar

request.getSession().invalidate();

tu pode implementar um SessionListener, nele, tu tens a disposição o método sessionDestroyed(), q é chamado sempre q uma sessão é encerrada :slight_smile:

E aí beleza?
Meu problema é semelhante só que gostaria de derrubar a sessão no momento que o tomcat caisse. quano derrubo o tomcat e alguém tiver com uma sessão aberta. assim que estarto o tomcat ele continua na mesma sessão.
Como derrubar a sessão junto com o tomcat? tem como e captar este evento? Em que momento posso usar o SessionDetroy()?

perai, deixa eu ver se eu entendi… tu quer q, qnd tu restartar o tomcat, ele recupere todas as sessões q estavam ativas no momento do shutdown??? :roll: … sem chance, ele vai desalocar toda a memória q alocou, vai perder todas as referencias…

Na verdade cara, acontece justamente o “contrário”.
Não me expressei bem no meu poste.
O que quero é derrubar a sessão quando o tomcat cair.
Hoje toda vez que derrubo o tomcat, e o levanto o usuario continua na mesma sessão. Não gostaria que isso continuasse. Gostaria de derrubar a sessão e retornar a tela de login.

credo, nem sabia q isso era possivel… bem, mas tu vai usar a interface listener q eu disse, e no método sessionDestroyed( SessionEvent e ), tu pode fazer:

public void sessionDestroyed( SessionEvent e ) {

   e.getSession().invalidate();
}

e claro, configure o listener no DD (web.xml):

<listener>
   <listener-class>com.foo.ClasseQueImplementaOListener</listener-class>
</listener>

Desculpe minha ignorância mas eu faço isso onde? Eu estou usando o struts, implemento esta intarface no action?

não é na action não, tu implementa ela numa classe qualquer, por ex:

package com.foo.listener;

// imports

public class MyListener implements SessionListener {

   public void sessionCreated( SessionEvent e ) {

   }

   public void sessionDestroyed( SessionEvent e ) {

      e.getSession().invalidate();
   }
}

ai no web.xml:

<listener>
  <listener-class>com.foo.listener.MyListener</listener-class>
</listener> 

[quote=“matheus”]não é na action não, tu implementa ela numa classe qualquer, por ex:

package com.foo.listener;

// imports

public class MyListener implements SessionListener {

   public void sessionCreated( SessionEvent e ) {

   }

   public void sessionDestroyed( SessionEvent e ) {

      e.getSession().invalidate();
   }
}

ai no web.xml:

<listener> <listener-class>com.foo.listener.MyListener</listener-class> </listener> [/quote]

Nossa cara… eu fiz isso e o Tomcat gera uma Exception, quando lê o meu web.xml.

Exception:

06/05/2005 21:55:19 org.apache.coyote.http11.Http11Protocol init
INFO: Initializing Coyote HTTP/1.1 on http-8080
Starting service Tomcat-Standalone
Apache Tomcat/4.1.31
06/05/2005 21:55:21 org.apache.commons.digester.Digester error
SEVERE: Parse Error at line 36 column 11: The content of element type "web-app" must match "(icon?,display-name?,description?,dist
ributable?,context-param*,filter*,filter-mapping*,listener*,servlet*,servlet-mapping*,session-config?,mime-mapping*,welcome-file-l
ist?,error-page*,taglib*,resource-env-ref*,resource-ref*,security-constraint*,login-config?,security-role*,env-entry*,ejb-ref*,ejb
-local-ref*)".
org.xml.sax.SAXParseException: The content of element type "web-app" must match "(icon?,display-name?,description?,distributable?,
context-param*,filter*,filter-mapping*,listener*,servlet*,servlet-mapping*,session-config?,mime-mapping*,welcome-file-list?,error-
page*,taglib*,resource-env-ref*,resource-ref*,security-constraint*,login-config?,security-role*,env-entry*,ejb-ref*,ejb-local-ref*
)".
        at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
        at org.apache.xerces.util.ErrorHandlerWrapper.error(Unknown Source)
        at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
        at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
        at org.apache.xerces.impl.dtd.XMLDTDValidator.handleEndElement(Unknown Source)
        at org.apache.xerces.impl.dtd.XMLDTDValidator.endElement(Unknown Source)
        at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanEndElement(Unknown Source)
        at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
        at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
        at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
        at org.apache.xerces.parsers.DTDConfiguration.parse(Unknown Source)
        at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
        at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
        at org.apache.commons.digester.Digester.parse(Digester.java:1548)
        at org.apache.catalina.startup.ContextConfig.applicationConfig(ContextConfig.java:220)
        at org.apache.catalina.startup.ContextConfig.start(ContextConfig.java:579)
        at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:181)
        at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
        at org.apache.catalina.core.StandardContext.start(StandardContext.java:3523)
        at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1141)
        at org.apache.catalina.core.StandardHost.start(StandardHost.java:707)
        at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1141)
        at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:316)
        at org.apache.catalina.core.StandardService.start(StandardService.java:450)
        at org.apache.catalina.core.StandardServer.start(StandardServer.java:2143)
        at org.apache.catalina.startup.Catalina.start(Catalina.java:463)
        at org.apache.catalina.startup.Catalina.execute(Catalina.java:350)
        at org.apache.catalina.startup.Catalina.process(Catalina.java:129)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:324)
        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:156)
06/05/2005 21:55:21 org.apache.struts.util.PropertyMessageResources <init>
INFO: Initializing, config='org.apache.struts.util.LocalStrings', returnNull=true
06/05/2005 21:55:21 org.apache.struts.util.PropertyMessageResources <init>
INFO: Initializing, config='org.apache.struts.action.ActionResources', returnNull=true
06/05/2005 21:55:22 org.apache.struts.util.PropertyMessageResources <init>
INFO: Initializing, config='org.apache.webapp.admin.ApplicationResources', returnNull=true
06/05/2005 21:55:28 org.apache.coyote.http11.Http11Protocol start
INFO: Starting Coyote HTTP/1.1 on http-8080
06/05/2005 21:55:28 org.apache.jk.common.ChannelSocket init
INFO: JK2: ajp13 listening on /0.0.0.0:8009
06/05/2005 21:55:28 org.apache.jk.server.JkMain start
INFO: Jk running ID=0 time=0/131  config=C:\Tomcat\conf\jk2.properties

Meu web.xml está assim:

<?xml version="1.0" ?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>

    <filter>
        <filter-name>Filtro</filter-name>
        <filter-class>br.com.delta.filtros.Filtro</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>Filtro</filter-name>
        <url-pattern>/servlets/*</url-pattern>
    </filter-mapping>

    <servlet>
        <servlet-name>servlet</servlet-name>
        <servlet-class>br.com.delta.servlets.Servlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>servlet</servlet-name>
        <url-pattern>/servlets/TesteServlet</url-pattern>
    </servlet-mapping>

	<!-- Lista de Boas Vindas -->

    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

    <listener>
       <listener-class>br.com.delta.YMFSessionListener</listener-class>
    </listener>

</web-app>

O engraçado é que eu coloquei no construtor da da classe que implementa HttpSessionListener um System.out.println(“teste”); e é impresso normal…

O que pode ser?
Porque o tomcat gera esta exception?

Atn.
Dennys Fredericci

se vc ler o erro, vai notar q a declaração de listener tem q vir antes da declaração de servlet…

hum… saquei, não tinha percebido que existe um lugar obrigatório… agora percebi…

valeu!

Atn.
Dennys Fredericci

Pessoalll …

Ainda estou com uma duvida … na minha implementação eu tenho o Listener ( com os metodos sessionCreated, sessionDestroyed, etc e tal) o meu web.xml esta configurado corretamente … a duvida eh a seguinte: como faço para informar a minha pagina jsp que destrua uma sessão??
Neste trecho de codigo eu verifico o valor da variavel de sessão, se for exit eu deleto o nome do usuario da base de dados e queria destruir a sessão dele !!!

[quote]if(request.getParameter(“local”).equals(“exit”)){
PreparedStatement stmtDel = null;
int execDel = 0;
//remover o usuário atual da base de dados
try {
query = “delete from estatisticas_online where nomeContato= '”+session.getValue(“nomecontato”)+"’";
stmtDel = conUtilDB.prepareStatement(query);
execDel = stmtDel.executeUpdate();
} catch(SQLException e){
//e.printStackTrace();

     } finally{
stmtDel.close();
session.invalidate();
execDel = 0;

}[/quote]

Abraços,

[quote=“Spirulita”]a duvida eh a seguinte: como faço para informar a minha pagina jsp que destrua uma sessão??
[/quote]

chamando invalidate() ué… hehehe

Olá …

Entaum … eu usei o invalidate() …
O meu problema eh o seguinte: eu tenho um contador que verifica qtas sessões foram abertas. Ate ai funciona uma beleza!! Agora eu faço o seguinte teste: Faço login na pagina e depois o Logoff e repito essa ação umas 5 vezes … na hora que vou ver qtas sessões estão abertas … o meu contador me mostra 5!!! Eu queria que toda vez que o usuaria fizese o logoff a sessão fosse destruida!!
Entendeu a minha duvida?!?!

Abraços,

como foi dito acima use:

session.invalidate();

:wink:

faça um teste… abra o browser, faça uma requisição, e veja o contador em 1… depois abra outro browser e veja o contador em 2… depois feche um deles e de refresh no outro, o contador deve ir para 1…

agora, mude no seu código, coloque um invalidate() caso request.getParameter( “foo” ) != null. Abra um browser e faça uma requisição, e veja o contador em 1… abra outro browser e faça o mesmo… o contador irá para 2… agora em um desses browsers faça de novo a requisição mas passando um parametro ?foo=abc… o contador deve ir para 1 de novo… teoricamente falando! haehaehahae

Pessoal …

Muito obrigada pela ajuda … acabei entendendo o que o contador estava fazendo de errado!!

Abraços,