http 是无状态的,无法感知用户在线状态
登录增加在线人数、推出减少在线人数,这是非常不准确的做法(比如用户直接关闭浏览器,而不是点击退出系统,此时就无法正确的统计)
第一个办法:session 的个数
比如监听 session 创建,每创建一个session则增加一个在线人数,每销毁一个session就减少一个在线人数。在java里实现很简单。
package com.demo.listener;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class PeopleListener implements HttpSessionListener {
/**
* 监听session创建
* @param se
*/
@Override
public void sessionCreated(HttpSessionEvent se) {
ServletContext context = se.getSession().getServletContext();
Integer num = (Integer) context.getAttribute("online_num");
if(num == null)
num = 0;
++num;
context.setAttribute("online_num",num);
System.out.println("新增一位用户...");
}
/**
* 监听session销毁
* @param se
*/
@Override
public void sessionDestroyed(HttpSessionEvent se) {
ServletContext context = se.getSession().getServletContext();
Integer num = (Integer) context.getAttribute("online_num");
if(num == null)
num = 0;
else
--num;
context.setAttribute("online_num",num);
System.out.println("减少一位用户...");
}
}
对于 php 等没有 application 的语言,是无法获取session的个数的,此时可以通过把 session 存入数据库实现,比如在 session 创建时,记录(session_id())到数据库中,并记录添加的时间,每次点击都记录最新活动时间,并把5分钟外的session全部删掉,那么当前表中的记录数,就是当前在线人数。(尽管不那么精确,但是很接近了)
websocket方案
WebSocket技术实现了什么
在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
在 WebSocket API 中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。
则每次创建 websocket,则增加一个在线人数,websocket断开则减少一个在线人数。
服务器可以检测到 websocket 的活动,并进行广播,当前在线记录数考虑记录在 application 中,php等语言可以记录在数据库或redis。