需求说明
实现用户登录时,可查看在线用户列表;用户注销时,其信息从用户列表中删除。
实现思路
我们可以使用监听器来完成,实现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可以监听请求的创建和销毁