Trouver le nombre de sessions actives créées à partir D'une IP client donnée

y a-t-il un moyen de déterminer le nombre de sessions actives créées à partir d'une adresse IP client donnée?

10
demandé sur BalusC 2010-09-09 22:29:55

3 réponses

l'API Servlet standard ne propose pas de fonctionnalités pour cela. Le mieux que vous pouvez faire est de maintenir un Map<HttpSession, String> vous-même (où le String est L'adresse IP) avec et vérifier chaque ServletRequest si le HttpSession#isNew() et l'ajouter à la Map avec ServletRequest#getRemoteAddr() . Ensuite, vous pouvez obtenir le nombre d'adresses IP avec une session active en utilisant Collections#frequency() Map#values() . Vous devez seulement vous assurer que vous supprimez le HttpSession du Map pendant HttpSessionListener#sessionDestroyed() .

tout cela peut être fait en un seul Listener mettant en œuvre le ServletContextListener , HttpSessionListener et ServletRequestListener .

voici un exemple de coup d'envoi:

public class SessionCounter implements ServletContextListener, HttpSessionListener, ServletRequestListener {

    private static final String ATTRIBUTE_NAME = "com.example.SessionCounter";
    private Map<HttpSession, String> sessions = new ConcurrentHashMap<HttpSession, String>();

    @Override
    public void contextInitialized(ServletContextEvent event) {
        event.getServletContext().setAttribute(ATTRIBUTE_NAME, this);
    }

    @Override
    public void requestInitialized(ServletRequestEvent event) {
        HttpServletRequest request = (HttpServletRequest) event.getServletRequest();
        HttpSession session = request.getSession();
        if (session.isNew()) {
            sessions.put(session, request.getRemoteAddr());
        }
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent event) {
        sessions.remove(event.getSession());
    }

    @Override
    public void sessionCreated(HttpSessionEvent event) {
        // NOOP. Useless since we can't obtain IP here.
    }

    @Override
    public void requestDestroyed(ServletRequestEvent event) {
        // NOOP. No logic needed.
    }

    @Override
    public void contextDestroyed(ServletContextEvent event) {
        // NOOP. No logic needed. Maybe some future cleanup?
    }

    public static SessionCounter getInstance(ServletContext context) {
        return (SessionCounter) context.getAttribute(ATTRIBUTE_NAME);
    }

    public int getCount(String remoteAddr) {
        return Collections.frequency(sessions.values(), remoteAddr);
    }

}

le définissent dans web.xml comme suit:

<listener>
    <listener-class>com.example.SessionCounter</listener-class>
</listener>

vous pouvez l'utiliser dans n'importe quel servlet comme suit:

SessionCounter counter = SessionCounter.getInstance(getServletContext());
int count = counter.getCount("127.0.0.1");
13
répondu BalusC 2011-02-17 18:53:11

j'avais besoin d'obtenir cette information rapidement sans nouveaux déploiements. Cela peut être fait en modifiant JSP et en ajoutant l'extrait suivant. (Seules les sessions avec activité auront la valeur définie):

<%
 // Set user agent and ip in session
 session.setAttribute("agent", request.getHeader("user-agent") + "@" + request.getRemoteAddr());
%>

puis créer un script groovy pour interroger jmx:

import javax.management.remote.*
import javax.management.*
import groovy.jmx.builder.*

// Setup JMX connection.
def connection = new JmxBuilder().client(port: 4934, host: '192.168.10.6')
connection.connect()

// Get the MBeanServer.
def mbeans = connection.MBeanServerConnection

def mbean = new GroovyMBean(mbeans, 'Catalina:type=Manager,host=localhost,context=/')
println "Active sessions: " + mbean['activeSessions']

def sessions = mbean.listSessionIds().tokenize(' ');

def ips = [:];
def agents = [:];

sessions.each
{
    def agentString = mbean.getSessionAttribute(it, "agent");
    if(agentString != null)
    {
        agent = agentString.tokenize('@');
    }
    else
    {   
        agent = ['unknown', 'unknown'];
    }

    if(agents[agent[0]] == null)
    {
        agents[agent[0]] = [];
    }
    agents[agent[0]] += [it];

    if(ips[agent[1]] == null)
    {
        ips[agent[1]] = [];
    }
    ips[agent[1]] += it;


};

println "Ips"
ips = ips.sort { -it.value.size }
ips.each
{
    ip, list ->
    println "${ip}\t${list.value.size}";
    //println list;
    //println "";
}

println ""
println "Agents"
agents = agents.sort { -it.value.size }
agents.each
{
    agent, list ->
    println "${agent}\t${agents[agent].size}";
    //println list;
    //println "";
}

résultat

Active sessions: 729
Ips
unknown 102
68.180.230.118  11
80.213.88.107   11
157.55.39.127   9
81.191.247.166  2
...

Agents
Mozilla/5.0 (compatible; MJ12bot/v1.4.5; http://www.majestic12.co.uk/bot.php?+) 117
unknown 102
Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm) 55
Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp) 29
...
1
répondu Brimstedt 2015-07-22 11:13:32

très bel exemple Balus C. Nous avons résolu ce problème en utilisant un auditeur Observateur. Voici bel exemple/tutoriel pour le même.

http://www.big-oh.net/BigOhSoftwareWeb/content/tutorials/requestObserverListener.jsp

vient de penser qu'il sera utile aux autres visiteurs. :)

Modifier : *** En Avril 2017 **

ressemble au http://www.big-oh.net/ Le site qui contient la source ci-dessus est mort. ici est la source de web.archive.org. En outre, le fichier référencé page Web dans github gist. Résumé source et de ses aperçu html

0
répondu Ellipsis 2017-04-20 22:05:32