Listar HttpSessions ativas dum container

4 respostas
fr3akoutTotal

Caros, boa tarde.

Estou com um problema ao tentar listar as sessoes ativas de um container, a finalidade seria para matar determinadas sessoes ativas. O problema eh que qdo rodo a aplicacao, abro uma sessao ao acessar o servlet, e dps abro mais algumas para ver se ta listando certinho. Acesso o servlet de pcs diferentes/abro janelas do safari distintas…e nunca passa de 1 sessao. vejam o codigo:

Listener:

package app.listeners;

import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;

/**
 * <p><b>A listener to get a session list from container.</b></p>
 *
 **/
public class SessionListListener implements ServletContextListener, HttpSessionListener {
  
  public void contextInitialized(ServletContextEvent e) {
      e.getServletContext().setAttribute("sessionList", new ArrayList());
  }
  
  public void contextDestroyed(ServletContextEvent e) {
      
  }
  
  public void sessionCreated(HttpSessionEvent e) {
      HttpSession session = e.getSession();
      List sessionList = (List) session.getServletContext().getAttribute("sessionList");
      sessionList.add(session);
  }
  
  public void sessionDestroyed(HttpSessionEvent e) {
      HttpSession session = e.getSession();
      List sessionList = (List) session.getServletContext().getAttribute("sessionList");
      sessionList.remove(session);
  }  
}

web.xml:

&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"&gt;
    &lt;listener&gt;
        &lt;listener-class&gt;app.listeners.SessionListListener&lt;/listener-class&gt;
    &lt;/listener&gt;
    &lt;servlet&gt;
        &lt;servlet-name&gt;SessionListServlet&lt;/servlet-name&gt;
        &lt;servlet-class&gt;app.servlets.SessionListServlet&lt;/servlet-class&gt;
    &lt;/servlet&gt;
    &lt;servlet-mapping&gt;
        &lt;servlet-name&gt;SessionListServlet&lt;/servlet-name&gt;
        &lt;url-pattern&gt;/SessionListServlet&lt;/url-pattern&gt;
    &lt;/servlet-mapping&gt;
    &lt;session-config&gt;
        &lt;session-timeout&gt;
            30
        &lt;/session-timeout&gt;
    &lt;/session-config&gt;
    &lt;welcome-file-list&gt;
	&lt;welcome-file&gt;
            index.jsp
        &lt;/welcome-file&gt;
    &lt;/welcome-file-list&gt;
&lt;/web-app&gt;

Parte importante do HTML:

&lt;form name="submitForm" action="SessionListServlet" method="get"&gt;
     &lt;input type="submit" value="Touch this!"/&gt;
&lt;/form&gt;

Servlet:

package app.servlets;

import java.io.*;
import java.util.ArrayList;
import java.util.Iterator;

import javax.servlet.*;
import javax.servlet.http.*;

/**
 *
 * @author dimitrimartins
 * @version 1.0
 *
 */
public class SessionListServlet extends HttpServlet {
    
    /** Processes requests for both HTTP &lt;code&gt;GET&lt;/code&gt; and &lt;code&gt;POST&lt;/code&gt; methods.
     * @param request servlet request
     * @param response servlet response
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        /* TODO output your page here
        out.println("&lt;html&gt;");
        out.println("&lt;head&gt;");
        out.println("&lt;title&gt;Servlet SessionListServlet&lt;/title&gt;");
        out.println("&lt;/head&gt;");
        out.println("&lt;body&gt;");
        out.println("&lt;h1&gt;Servlet SessionListServlet at " + request.getContextPath () + "&lt;/h1&gt;");
        out.println("&lt;/body&gt;");
        out.println("&lt;/html&gt;");
         */
        out.close();
        
        ArrayList sessionList = (ArrayList)this.getServletContext().getAttribute("sessionList");
        
        Iterator it = sessionList.iterator();
        
        while(it.hasNext()) {
            HttpSession s = (HttpSession)it.next();
            
            System.out.println(s.getId());
        }
        
        System.out.println("Session list size: " + sessionList.size());
    }
    
    // &lt;editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code."&gt;
    /** Handles the HTTP &lt;code&gt;GET&lt;/code&gt; method.
     * @param request servlet request
     * @param response servlet response
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }
    
    /** Handles the HTTP &lt;code&gt;POST&lt;/code&gt; method.
     * @param request servlet request
     * @param response servlet response
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }
    
    /** Returns a short description of the servlet.
     */
    public String getServletInfo() {
        return "Short description";
    }
    // &lt;/editor-fold&gt;
}

Ao executar, a saida eh:

INFO: Server startup in 990 ms
May 11, 2008 2:09:43 PM org.apache.catalina.startup.HostConfig checkResources
INFO: Undeploying context [/SessionListExample]
6C6289558972E2F762B54A5E7B2853E8
Session list size: 1
6C6289558972E2F762B54A5E7B2853E8
Session list size: 1

Na segunda ocorrencia o list size deveria sair 2…O numero grande ai, eh o session.getId(); de cada session.

Alguem poderia dar um help???

Muito grato desde ja…


Se ajudar: to usando o NetBeans 5.5 pra Mac OS X, no leopard 10.5.2 e tomcat 5.5 bundled.
Acessando pelo localhost ou por uma maquina fisica remota diferente da que esta rodando a aplicacao, da no mesmo.

4 Respostas

Paulo_Silveira

Ele ta te detectando como mesmo usario. Abrir diferentes janelas do safari nao seria suficiente mesmo, mas testar uma vez de ummmicro e outra de outro deveria funcionar perfeitamente. tem apache na frente desse tomcat? vc testou de 3 micros diferentes, incluindo o localhost, e continua mostrando uma so?

de um log (ou sysout) no seu context listener qdo sessionCreated

fr3akoutTotal

Cara, testei direito, sai do wifi q me deixava atras do firewall do router wireless com o ip 192.168.0.196 e criei uma conexao pppoe e liguei um cabo direto na porta lan, ai fiquei visivel na wan! Dai em diante, mandei meus amigos do MSN entrarem no link do meu ip:porta/app/servlet, ai ele comecou a identificar como sessoes diferentes, ta listando direitinho agora! Valeu pela sua dica ai!!

Me diz uma outra coisa, pra testar essa funcionalidade, tive que tirar fora o framework Struts, pois de dentro duma action nao posso chamar o getServletContext para que eu possa recuperar a lista de sessoes atraves desta linha:

ArrayList sessionList = (ArrayList)this.getServletContext().getAttribute(“sessionList”);

O que fazer??

Grato!!

fr3akoutTotal

Bem, deixa pra la, no desespero aqui acabei ate achando haha…a linha equivalente a essa da minha pergunta em STRUTS eh:

ArrayList sessionList = (ArrayList)this.getServlet().getServletContext().getAttribute(“sessionList”);

Em todo caso, mto obrigado pela sua ajuda!

dahenz

Ressucitando o post. Gostaria de fazer o mesmo que o colega… mas listando IPs remotos.

Eu estou atribuindo em cada login, o ipRemoto na sessão e gostaria de listar todos os IPs independentemente da minha sessão, mas de outras sessões também… Como eu faria isto?

Obrigado.

Criado 11 de maio de 2008
Ultima resposta 5 de jun. de 2014
Respostas 4
Participantes 3