Java Web监听器-在线人数统计

监听器的启动顺序:在一个web项目中可以有多个监听器,按照我们在web.xml中的注册顺序进行加载的。如果web.xml中同时注册有监听器,过滤器和servlet,加载顺序是监听器>过滤器>servlet

三种监听

ServletContextListener application
HttpSessionListener session
ServletRequestListener request

HttpSessionListener
注册都是在web.xml

<listener>
        <listener-class>com.great.listener.FirstListerner</listener-class>
    </listener>
public class FirstListerner implements HttpSessionListener {

    @Override
    public void sessionCreated(HttpSessionEvent se) {
        // TODO Auto-generated method stub

    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        // TODO Auto-generated method stub

    }

一个HttpSession可以注册多个HttpSessionListener接口,
一个web应用中可以有多个HttpSession对象

HttpSessionListener的主要用途:
统计在线人数
记录访问日志,记录访问时间、访问的ip
销毁session和session的声明周期息息相关
可以在web.xml配置session超时的时间

<session-config>
<session-timeout>10</session-timeout>
</session-config>

超时并不精准

被监听对象属性的增加或删除

Servlet中定义了以下三个接口:
ServletContextAttributeListener、HttpSessionAttributeListener、ServletRequestAttributeListener这三个接口分别实现了对ServletContext、HttpSession、ServletRequest对象的属性增、删的监听。
接口中定义了三个方法:
attributeAdded方法、attributeRemoved方法、attributeReplaced方法

例子:在线人数及ip地址等的统计(通过Sessionid去统计)

HttpSessionListener

package com.great.listener;

import java.util.List;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

import com.great.entity.User;
import com.great.utils.SessionUtils;

public class OnlineNumListerner implements HttpSessionListener {
    private int userNum;

    @Override
    public void sessionCreated(HttpSessionEvent se) {
        userNum++;
        //存入全局的web变量
        se.getSession().getServletContext().setAttribute("userNum", "userNum");
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        userNum--;
        se.getSession().getServletContext().setAttribute("userNum", "userNum");
        java.util.List<User> userList=null;
        userList=(List<User>) se.getSession().getServletContext().getAttribute("list");
        if (se.getSession().getId()!=null) {

            userList.remove(SessionUtils.getUserBySessionId(userList, se.getSession().getId()));
        }
    }



}

由于要获取ip,而ip地址在Session中无法获取,在request中可以,想到ServletRequestListener

package com.great.listener;

import java.awt.List;
import java.util.ArrayList;
import java.util.Date;

import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpServletRequest;

import com.great.entity.User;

public class MyRequestListerner implements ServletRequestListener{
    private java.util.List<User> userList;
    @Override
    public void requestDestroyed(ServletRequestEvent sre) {

    }

    @Override
    public void requestInitialized(ServletRequestEvent sre) {
        userList=(java.util.List<User>) sre.getServletContext().getAttribute("list");
        if (userList==null) {
            userList=new ArrayList<User>();
        }
        //初始化的时候获取当前session的id
        HttpServletRequest request=(HttpServletRequest) sre.getServletRequest();
        String id = request.getSession().getId();
        //当sessionid为空就添加
        if(id==null){

            User user=new User();
            user.setSessionIdString(id);
            //获取客户端的ip地址
            user.setIpString(request.getRemoteAddr());

            user.setFirstTimeString(new Date());
            userList.add(user);
        }
        sre.getServletContext().setAttribute("list", userList);

    }

}

用到的其他类

package com.great.utils;

import java.util.List;

import com.great.entity.User;

public class SessionUtils {
    public static User getUserBySessionId(List<User> list,String sessionId){
        for (int i = 0; i < list.size(); i++) {
            User user=list.get(i);
            if (sessionId.equals(user.getSessionIdString())) {
                return user;
            }

        }
        return null;

    }
}
package com.great.entity;

import java.util.Date;

public class User {
    private String sessionIdString;
    private String ipString;
    private Date firstTimeString;
    public String getSessionIdString() {
        return sessionIdString;
    }
    public void setSessionIdString(String sessionIdString) {
        this.sessionIdString = sessionIdString;
    }
    public String getIpString() {
        return ipString;
    }
    public void setIpString(String ipString) {
        this.ipString = ipString;
    }
    public Date getFirstTimeString() {
        return firstTimeString;
    }
    public void setFirstTimeString(Date firstTimeString) {
        this.firstTimeString = firstTimeString;
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值