11
votes

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

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


1 commentaires

Pourquoi avez-vous [J2EE] dans le titre, il existe une raison pour


3 Réponses :


15
votes

L'API Standard Servlet ne propose pas d'installations pour cela. Meilleure ce que vous pouvez faire est de maintenir un carte vous-même (où la chaîne est l'adresse IP) avec et vérifiez chaque SERVLERQUEST Si le httpsession # isnew () et ajoutez-le au Carte avec < Code> servleRequest # getRemOteaddr () . Ensuite, vous pouvez obtenir la quantité d'adresses IP avec une session active à l'aide de Collections # Fréquence () sur Valeurs de la carte () . Il vous suffit de vous assurer de supprimer le httppsession à partir de la carte pendant httpsSessionListener # SéanceDestroyed () Tout cela peut être fait dans un seul auditeur Mise en œuvre du ServletContextListener , httpspessionListener et ServletRequestListener .

Voici un exemple d'un coup d'envoi: xxx

définir dans web.xml Comme suit: xxx

Vous pouvez l'utiliser dans n'importe quel service Simpe comme suit: xxx


12 commentaires

J'aurais utilisé une faiblesse des sessions pour éviter d'écouter des sessions. Je pensais à un mappe > d'abord, mais gérez manuellement les sessions destructions semble assez lourde pour moi.


@Colin: Vous dépendez alors de l'empressement du GC. Cela rend tout moins solide. Ce n'est pas une cache ou donc.


Ceci est un ancien poste qui n'a pas été mis à jour depuis un moment - mais pour éviter de problèmes pour les futurs lecteurs, il convient de souligner que cet exemple est bon à la plupart des égards. HashMap n'est pas une structure de données de fil-sécurité et cet exemple ne fait rien pour synchroniser les accès à HASHMAP, ce qui signifie que cela dans le monde réel entraînera des problèmes de concurrence. Juste un avertissement; Toute mise en œuvre doit utiliser une structure de données différente ou une autre doit synchroniser l'accès aux sessions-variable.


@Balusc: belle solution. Ne pas avoir eu beaucoup de besoin d'une structure de type hashmap simultanée (jusqu'à présent), je n'étais pas immédiatement sûr de la meilleure suggestion. Une petite recherche confirme que ConcurrenthashMap est un excellent choix. Merci pour l'éducation - et la classe de squelette que je vais emprunter pour un problème que j'ai. :)


@Balusc: Oups, je crois qu'il y a toujours un bogue de concurrence dans cette solution. Dans #Requestinitialisé () L'appel à Sessions.put () est trop simpliste - cette méthode ne semble pas être atomique. Au lieu de cela, il devrait s'agir de sessions.puttifabsent (). L'état Javadocs pour #PutifAbsent indique qu'il est "[similaire à la vérification, alors-mettre-then-get sauf] l'action est effectuée atomiquement". Les documents pour #put ne prétendent aucune réclamation à l'atomicité. Voir DMY999.fr/article/34/CORRET-USION-OF-CONCURHHASHMAPIDE " A> Pour plus d'informations.


@Bane: point équitable également, mais pourrait-il y avoir plusieurs sessions avec le même identifiant de différentes adresses IP intérieures de l'IP de même servletContainer? :) J'avais plus de problèmes de concurrence potentiels avec sessions.values ​​() à l'esprit, pas dans sessions.put () .


@Balusc: Ah, très bon point! Dans ce cas particulier, vous êtes mort-on. Désolé pour ma surveillance. Dans le cas de #values, j'étais un peu inquiet à ce sujet aussi mais figurait aussi longtemps que #getCount n'étant pas dépendant de ne rien faire pour que de simples rapports, c'est probablement assez sûr; se mettre d'accord?


@Bane: oui. Même dans ce cas, les conséquences de l'utilisation de hashmap au lieu de Concurrenthashmap serait toujours très minime. Vous ne risquez que d'obtenir un rapport inexact.


Approche intéressante, alors disons que vous souhaitez éviter les attaques de pirate informatiques qui envoient plusieurs demandes (se terminant par plusieurs sessions) par seconde. Vous pouvez refuser des demandes en acceptant uniquement 3 sessions par IP. Cependant: comment gérez-vous avec de grandes entreprises dans lesquelles vous pourriez avoir 100 utilisateurs d'accéder à votre site, chacun en utilisant votre site normalement, tous ont la même adresse IP (car toute la société utilise la même adresse IP sortante) ... Toute proposition de solution à cela ?


@Ballusc pourquoi ne pouvait pas carte sessions être statique ici?


@Mathieucastets: Parce que c'est une application Scoped, pas JVM / Classe Scoped.


Pour la performance, pourquoi ne pas garder mappe string est l'adresse IP?




1
votes

Je devais obtenir cette information rapidement sans de nouveaux déploiements. Cela peut être fait en modifiant JSP et ajoutez l'extrait suivant. (Seules les sessions avec activité obtiendront la valeur définie): xxx pré>

puis créer un script groovy à la requête JMX: p> xxx pré>

résultat H2>
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
...


0 commentaires