servlet中监听器listener实现在线登录人数与在线的人员信息显示(ip地址,sessionid,登录时间)

一。.首先创建一个退出时使sessio失效的servlet:
package listenerdemo;

import java.io.IOException;
import javax.servlet.ServletException;
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;

@WebServlet("/LogoutServlet")
public class LogoutServlet extends HttpServlet {
	//用户退出时。调用此类,销毁session
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("退出调用此");
		HttpSession session=request.getSession();
		//调用退出方法时,如果此session不为空,则让session失效
		if(session!=null){}
		session.invalidate();
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

二。建立一个jsp用于显示在线人数,与在线人员信息

 

<%@page import="java.util.ArrayList"%>
<%@page import="listenerdemo.User"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>在线用户信息统计</title>

<script src="js/jquery.js"></script>
<script type="text/javascript">
$(function(){$("#aa").click(
		function(){
		//跳转到	LogoutServlet页面
			window.location.href="LogoutServlet";
			alert("123");
		}	
		);
});
</script>
</head>
<body>
	<%
		// 设置每隔5秒刷新一次
		response.setIntHeader("Refresh", 5);
	%>
	<h1>测试session与request监听listener</h1>
	<h1 id="h">
		在线人数为:<%=application.getAttribute("countnum") %></h1>
	<!-- 使用EL表达式表示的值 -->
	<h1 id="hh">在线人数为:${countnum}</h1>
	<!-- 通过application对象得到存的user_list -->
	<% List<User> userlist= (ArrayList<User>)application.getAttribute("user_list");
	for(User user:userlist) { 
	out.print("sessionId为:    "+user.getSessionId()+"           ip地址为:   "+user.getIp()+"          登录时间为:  "+user.getLogintime()) ;
	out.print("<br>");
	}
	%>
	<!-- 点击退出,代表改用户退出此系统,销毁其sessionID -->
	<input id="aa" type="button" value="退出" />
</body>
</html>
三。创建一个用户对象,用于存储需要显示的用户信息。

package listenerdemo;

public class User {
private String sessionId;
private String logintime;
private String ip;
public User(String sessionId, String logintime, String ip) {
	this.sessionId = sessionId;
	this.logintime = logintime;
	this.ip = ip;
}
public String getSessionId() {
	return sessionId;
}
public void setSessionId(String sessionId) {
	this.sessionId = sessionId;
}
public String getLogintime() {
	return logintime;
}
public void setLogintime(String logintime) {
	this.logintime = logintime;
}
public String getIp() {
	return ip;
}
public void setIp(String ip) {
	this.ip = ip;
}
@Override
public String toString() {
	return "User [sessionId=" + sessionId + ", logintime=" + logintime + ", ip=" + ip + "]";
}

}
四。创建一个session的监听OnlineSession。

 

package listenerdemo;

import java.util.List;

import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

import util.OnlineUtil;


@WebListener
public class OnlineSession implements HttpSessionListener {
	private int count=0;//初始化登录人数为0;
	public void sessionCreated(HttpSessionEvent arg0)  { 
		count++;//如果创建一个session,说明有人登录了一次,人数+1
		System.out.println("创建了一个session"+count);
		arg0.getSession().getServletContext().setAttribute("countnum", count);
	}

	public void sessionDestroyed(HttpSessionEvent arg0)  {   
		count--;//如果销毁一个session,说明有人退出了一次,人数-1
		//转化为application对象去getAttribute;得到在OnlineRequest中存储的userlist集合
		List<User> userlists=(List<User>) arg0.getSession().getServletContext().getAttribute("user_list");
		//调用静态类中封装的方法
		User user=OnlineUtil.getUserfromUserlistBySessionId(userlists, arg0.getSession().getId());
		if(user!=null){
			userlists.remove(user);
			arg0.getSession().getServletContext().setAttribute("user_list", userlists);
		}
		
		System.out.println("销毁了一个session"+count);
		arg0.getSession().getServletContext().setAttribute("countnum", count);
	}

}


五。由于取得在线用户的IP地址需要request对象去调用,所以建立request的监听OnlineRequest;

package listenerdemo;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

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

import util.OnlineUtil;

@WebListener
public class OnlineRequest implements ServletRequestListener {
	private SimpleDateFormat dateformat=new SimpleDateFormat("YYYY年MM月dd日  HH:mm:ss");
	private List<User> userlists;

	public void requestInitialized(ServletRequestEvent arg0)  {
		//强转成HttpServletRequest才能调用getRemoteAddr获得ip地址;getSession().getId()获得session的id的方法
		HttpServletRequest req=(HttpServletRequest) arg0.getServletRequest();
		String ip=req.getRemoteAddr();//获得ip地址
		String sessionId=req.getSession().getId();//获得session的id
		String logintime=dateformat.format(new Date());//获得登录时候的时间
		//单例模式,当userlists为空时,才创建list对象
		if(userlists==null){
			userlists=new ArrayList<User>();
		}
		//才登录进来的user,调用封装的方法,如果userlist内没有此user的sessionid,则将这个user对象添加进userlist集合
		if(OnlineUtil.getUserfromUserlistBySessionId(userlists,sessionId)==null){

			User user=new User(sessionId, logintime, ip);
			userlists.add(user);
			//将新的userlists传出去,利于刷新
			req.getSession().getServletContext().setAttribute("user_list", userlists);
		}
	}
	public void requestDestroyed(ServletRequestEvent arg0)  { 
		System.out.println("requestDestroyed>>>>>>>>>");
	}

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值