一、实现的具体功能
- (1)实现用户在线数量的统计,并显示在页面上。
- (2)实现强制用户下线的功能。创建一个超链接,用于实现强制用户下线的功能。
- (3)监听session的创建和销毁。
二、代码实现 - (1)主页面:index.jsp。
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
<p>用户在线列表数量:${userTable.size()}</p>
<table border="1">
<tr>
<td>用户信息</td>
<c:forEach items="${userTable}" var="user">
</tr>
<tr>
<td>${user.key }</td>
<td><a href="KickUser?sid=${user.key}">踢你下线</a></td>
</tr>
</c:forEach>
</table>
</body>
</html>
- (2)服务器监听器:SCListener.java文件。
package com.listener;
import java.util.Hashtable;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSession;
/**
* Application Lifecycle Listener implementation class SCListener
*
*/
@WebListener
public class SCListener implements ServletContextListener {
//在线用户数量sessionId , session
private static Hashtable<String,HttpSession> userTable;
/**
* Default constructor.
*/
public SCListener() {
// TODO Auto-generated constructor stub
}
/**
* @see ServletContextListener#contextDestroyed(ServletContextEvent)
*/
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
//服务器关闭了
System.out.println("服务器关闭了......");
}
/**
* @see ServletContextListener#contextInitialized(ServletContextEvent)
*/
public void contextInitialized(ServletContextEvent sre) {
// TODO Auto-generated method stub
//服务器启动
System.out.println("服务器启动了......");
//创建用户在线列表
userTable = new Hashtable<String , HttpSession>();
//放入全局对象,第一个userTable的Key
sre.getServletContext().setAttribute("userTable",userTable );
}
}
- (3)UserListener.java文件。
package com.listener;
import java.util.Hashtable;
import javax.servlet.ServletContext;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
/**
* Application Lifecycle Listener implementation class UserListener
*
*/
@WebListener
public class UserListener implements HttpSessionListener {
/**
* Default constructor.
*/
public UserListener() {
// TODO Auto-generated constructor stub
}
/**
* @see HttpSessionListener#sessionCreated(HttpSessionEvent)
*/
public void sessionCreated(HttpSessionEvent se) {
// TODO Auto-generated method stub
System.out.println("session创建了");
//获取全局对象
ServletContext sc = se.getSession().getServletContext();
//获取用户列表
Hashtable<String,HttpSession> userTable = (Hashtable<String,HttpSession>)sc.getAttribute("userTable");
//获取sessionId
String sid = se.getSession().getId();
//用户session信息添加到用户列表
userTable.put(sid, se.getSession());
System.out.println("用户在线数量:"+userTable.size());
}
/**
* @see HttpSessionListener#sessionDestroyed(HttpSessionEvent)
*/
public void sessionDestroyed(HttpSessionEvent se) {
// TODO Auto-generated method stub
System.out.println("session销毁了");
ServletContext sc = se.getSession().getServletContext();
//获取用户列表
Hashtable<String,HttpSession> userTable = (Hashtable<String,HttpSession>)sc.getAttribute("userTable");
//获取sessionId
String sid = se.getSession().getId();
//移除用户列表中的用户
userTable.remove(sid);
}
}
- (4)交互层用于实现强制用户下线的功能:KickUser.java文件。
package com.servlet;
import java.io.IOException;
import java.util.Hashtable;
import javax.servlet.ServletContext;
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;
/**
* Servlet implementation class KickUser
*/
@WebServlet("/KickUser")
public class KickUser extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public KickUser() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//获取Id
String sid = request.getParameter("sid");
//获取全局对象
ServletContext sc= request.getServletContext();
//获取用户列表
Hashtable<String,HttpSession> userTable = (Hashtable<String,HttpSession>)sc.getAttribute("userTable");
if(userTable.get(sid) != null) {
//销毁session
userTable.get(sid).invalidate();
}
response.sendRedirect("index.jsp");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
三、运行结果
- (1)用不同的浏览器打开,用户在线数就会增加,然后进行测试。