一。.首先创建一个退出时使sessio失效的servlet:
五。由于取得在线用户的IP地址需要request对象去调用,所以建立request的监听OnlineRequest;
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>>>>>>>>>");
}
}