existe-t-il un moyen de déterminer le nombre de sessions actives créées à partir d'une adresse IP client donnée? p>
3 Réponses :
L'API Standard Servlet ne propose pas d'installations pour cela. Meilleure ce que vous pouvez faire est de maintenir un Voici un exemple d'un coup d'envoi: p> définir dans Vous pouvez l'utiliser dans n'importe quel service Simpe comme suit: p> carte
vous-même (où la chaîne code code> est l'adresse IP) avec et vérifiez chaque SERVLERQUEST CODE>
Si le httpsession # isnew () code>
et ajoutez-le au Carte Code> avec < Code> servleRequest # getRemOteaddr () code> . Ensuite, vous pouvez obtenir la quantité d'adresses IP avec une session active à l'aide de
Collections # Fréquence () Code>
sur Valeurs de la carte () Code>
. Il vous suffit de vous assurer de supprimer le httppsession code> à partir de la carte code> pendant
httpsSessionListener # SéanceDestroyed () code>
Tout cela peut être fait dans un seul auditeur code> Mise en œuvre du
ServletContextListener Code>
, httpspessionListener code>
et ServletRequestListener code>
. P> web.xml code > Comme suit: p>
J'aurais utilisé une faiblesse des sessions pour éviter d'écouter des sessions. Je pensais à un mappe
@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 () code> à l'esprit, pas dans
sessions.put () code>.
@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 code> au lieu de
Concurrenthashmap code> 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
@Mathieucastets: Parce que c'est une application Scoped, pas JVM / Classe Scoped.
Pour la performance, pourquoi ne pas garder mappe
string code> est l'adresse IP?
Très bel exemple Balus C. Nous avons résolu ce problème en utilisant un observateur Listener. Voici bel exemple / tutoriel pour la même. p>
http://www.big-oh.net/BigOhSoftwareWeb /content/tutorials/requestObserverListener.jsp p>
Juste pensé qu'il sera utile aux autres visiteurs. :) P>
Edit: *** Avril 2017 ** p>
On dirait que le http://www.big-oh.net/ site qui contient la source ci-dessus est mort. ici < / a> est la source de web.archive.org. De plus, le a ajouté le fichier appelé page Web dans essentiel GitHub. Contenu essentiel la source et son html aperçu p>
@baszero, ajout de nouvelles sources pour votre référence. J'espère que cela t'aides.
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): puis créer un script groovy à la requête JMX: p> 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
...
Pourquoi avez-vous [J2EE] dans le titre, il existe une raison pour