集群中的用户(会话)计数

时间:2011-05-09 10:33:06

标签: java web-applications spring-security weblogic-10.x

是否有一种很好的方法可以在群集中运行的Java Web应用程序中获取登录用户数?

我用静态字段写了一个简单的HttpSessionListener,但我认为这在集群中不起作用。我可以看到有一个Spring Security解决方案,但我在一些论坛中读到这在集群中仍然不行。

我必须实现此用户数的产品是尝试独立于应用程序服务器,目前我们支持Tomcat,Weblogic和JBoss。目前我需要一个Weblogic 10.3集群的解决方案。

2 个答案:

答案 0 :(得分:4)

您可以在数据库中维护计数器,该计数器将在群集环境中运行。

答案 1 :(得分:0)

一个简单的教程,演示如何确定Java Web应用程序中的活动用户/会话。

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--;
  }

    }

}

在三个不同的浏览器上运行以下servlet将提供输出:(见下图)

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();
  }

 }

}

计划的输出:

  1. Eclipse浏览器 - &gt;
  2. Eclipse

    1. Firefox浏览器 - &gt;
    2. Firefox

      1. Internet Explorer浏览器 - &gt;
      2. IE

        1. 控制台输出 - &gt;
        2. Console

          更多信息:http://www.hubberspot.com/2013/09/how-to-determine-active-users-sessions.html