监听器实现查看在线用户列表

需求说明

​ 实现用户登录时,可查看在线用户列表;用户注销时,其信息从用户列表中删除。

实现思路

​ 我们可以使用监听器来完成,实现3个监听器的接口

/**

 * ServletContextListener:服务器启动时,将一个集合放入到application域中
 * HttpSessionAttributeListener:用户登录时,用户信息会保存到session域中,我们将session域中的信	      息保存到application域中
 * HttpSessionListener:用户注销时,将application域中的当前用户信息移除
 * @author
 */

​ 然后我们可以在用户列表的页面中输出application域集合中的用户信息,用户点击注销时,重定向到登录页面。

实现代码

@WebListener
public class OnlineListener implements ServletContextListener, HttpSessionListener, HttpSessionAttributeListener {

private List<String> onlineList;	//全局变量,保存用户信息的集合
private ServletContext application;	//application域对象
   
public void sessionCreated(HttpSessionEvent event)  {          
}

//用户的注销
public void sessionDestroyed(HttpSessionEvent event)  { 
     
	//获得注销的session
	HttpSession session = event.getSession();
	//获得注销的session域中的信息
	AccInfo accInfo = (AccInfo) session.getAttribute("accInfo");
	//获得application域对象的集合
	onlineList = (List<String>) this.application.getAttribute("onlines");
	//将要注销的用户名从集合移除
	onlineList.remove(accInfo.getAccRealName());
	//将移除后的集合放入application域中
	application.setAttribute("onlines", onlineList);
}
public void contextDestroyed(ServletContextEvent event)  {         
}

//session的增加
public void attributeAdded(HttpSessionBindingEvent event)  { 
     //session的增加,表示用户登录了,AccInfo指的是用户实体类
	AccInfo accInfo = (AccInfo) event.getValue();
	String realName = accInfo.getAccRealName();
	//获取application域对象的集合
	onlineList = (List<String>) this.application.getAttribute("onlines");
	//将登录的用户名添加到集合中
	onlineList.add(realName);
	//将修改后的集合放入application域中
	application.setAttribute("onlines", onlineList);
}
public void attributeRemoved(HttpSessionBindingEvent event)  {      
}

public void attributeReplaced(HttpSessionBindingEvent event)  {     
}
public void contextInitialized(ServletContextEvent event)  { 
     //服务器启动时,我们将一个空的集合放入到application域中
	onlineList = new ArrayList<>();
	application = event.getServletContext();
	application.setAttribute("onlines", onlineList);
}
}

以上是监听器中的代码,接下来我们就可以来输出用户信息到页面上来了。

<body>
    <h1>在线用户列表</h1>
 	<%
 		List<String> onlines = (List<String>) application.getAttribute("onlines");
 		for(String onlineNames : onlines){
 			%>

 			<h2><%= onlineNames %></h2>

 			<%
 		}
 	%>
 	<a href="invalidate.jsp">注销</a>
</body>

<body>
	<%
 		session.invalidate();
 		response.sendRedirect(request.getContextPath()+"/login.jsp");
 	%>
</body>

以上两段代码分别是用户在线列表页面和用户注销页面。

小结

  • 使用监听可以对application、session和request的范围属性进行监听
  • 使用ServletContextListener可以监听服务器的启动和关闭
  • 使用HttpSessionListener可以监听session的创建和session的注销
  • 使用HttpRequestListener可以监听请求的创建和销毁

猜你喜欢

转载自blog.csdn.net/codeliang20/article/details/106455472