The user account (session) in the cluster

Is there a good way to get the registered number of users in a Java web application that runs in a cluster?

I wrote a simple HttpSessionListener with a static field, but I believe this does not work in the cluster. I see that there is a Spring security solution, but I read on some forums that this is still not normal in the cluster.

The product in which I have to implement this user account is trying to be independent of the application server, we currently support Tomcat, Weblogic and JBoss. Right now I need a solution for Weblogic 10.3 clusters.

+4
source share
2 answers

You can maintain a counter in a database that will run on an env cluster.

+4
source

A simple tutorial to demonstrate how to define active users / sessions in a Java web application.

 package com.hubberspot.javaee.listener; import javax.servlet.annotation.WebListener; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; @WebListener public class OnlineUsersCounter implements HttpSessionListener { private static int numberOfUsersOnline; public OnlineUsersCounter() { numberOfUsersOnline = 0; } public static int getNumberOfUsersOnline() { return numberOfUsersOnline; } public void sessionCreated(HttpSessionEvent event) { System.out.println("Session created by Id : " + event.getSession().getId()); synchronized (this) { numberOfUsersOnline++; } } public void sessionDestroyed(HttpSessionEvent event) { System.out.println("Session destroyed by Id : " + event.getSession().getId()); synchronized (this) { numberOfUsersOnline--; } } } 

Running below the servlet in three different browsers will provide output like: (see the figure below)

 package com.hubberspot.javaee; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebInitParam; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import com.hubberspot.javaee.listener.OnlineUsersCounter; // @WebServlet annotation has a initParams field which takes // in initialization parameters for a servlet. // @WebInitParam annotation takes in a name and value for the // initialization parameters for the current Servlet. @WebServlet(name = "HelloWorldServlet" , urlPatterns = { "/HelloWorldServlet" } , initParams = { @WebInitParam(name = "user" , value = "Jonty") }) public class HelloWorldServlet extends HttpServlet { protected void doGet( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); // sessionCreated method gets executed HttpSession session = request.getSession(); session.setMaxInactiveInterval(60); try { out.println("<html>"); out.println("<body>"); out.println("<h2>Number of Users Online : " + OnlineUsersCounter.getNumberOfUsersOnline() + "</h2>"); out.println("</body>"); out.println("</html>"); } finally { out.close(); } } } 

Program Output:

  • Eclipse Browser →

Eclipse

  1. Firefox Browser →

Firefox

  1. Internet Explorer Browser →

IE

  1. Console exit →

Console

More details: http://www.hubberspot.com/2013/09/how-to-determine-active-users-sessions.html

0
source

All Articles