博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java session HttpSessionListener、HttpSessionBindingListener使用区别,实现在线人数统计以及踢出用户
阅读量:4125 次
发布时间:2019-05-25

本文共 6654 字,大约阅读时间需要 22 分钟。

java web项目中管理session的时候,除了在web.xml文件中设置过时时间

2
xxx分钟,还可以通过
HttpSessionListener
接口或HttpSessionBindingListener接口来实现对session的监控,通过监听session的新建和销毁来控制

实现HttpSessionListener接口:

package listener;import java.util.List;import javax.servlet.ServletContext;import javax.servlet.http.HttpSession;import javax.servlet.http.HttpSessionEvent;import javax.servlet.http.HttpSessionListener;public class OnlineListener implements HttpSessionListener {	public void sessionCreated(HttpSessionEvent event) {		System.out.println("新建session:" + event.getSession().getId());	}	public void sessionDestroyed(HttpSessionEvent event) {		HttpSession session = event.getSession();        ServletContext application = session.getServletContext();        // 取得登录的用户名        String username = (String) session.getAttribute("username");        // 从在线列表中删除用户名        List onlineUserList = (List) application.getAttribute("onlineUserList");        onlineUserList.remove(username);        System.out.println(username+"已经退出!");	}}

后要在web.xml中配置监听接口配置:

listener.OnlineListener

当用户首次访问网站页面的时候,框架就会生成一个sessionID这时执行listener.OnlineListener.sessionCreated()方法,执行操作,不是对单个session与用户的是对整个全局的session的操作

项目其他文件代码:

index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%>              My JSP 'index.jsp' starting page	
HttpSessionListener方式监听Session:
登陆:

httpSessionLogin.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@page import="listener.OnlineListener"%><%	request.setCharacterEncoding("UTF-8");	// 取得登录的用户名	String username = request.getParameter("username");	// 把用户名保存进session	System.out.println("jspsession:" + session.getId());	session.setAttribute("username", username);	session.setAttribute("onlineUserList", new OnlineListener(username));		System.out.println("用户:"+username+" 登陆成功");	// 把用户名放入在线列表	List onlineUserList = (List) application.getAttribute("onlineUserList");	// 第一次使用前,需要初始化	if (onlineUserList == null) {	    onlineUserList = new ArrayList();	    application.setAttribute("onlineUserList", onlineUserList);	}	onlineUserList.add(username);		// 成功	response.sendRedirect("result.jsp");%>

result.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%>              My JSP 'index.jsp' starting page	
登陆成功

您好:${username} [注销]

当前在线用户:
<% List onlineUserList = (List) application.getAttribute("onlineUserList"); for (int i = 0; i < onlineUserList.size(); i++) { String onlineUsername = (String) onlineUserList.get(i); %>
<% } %>
<%=onlineUsername%> 删除

HttpSessionBindingListener运用时不用在web.xml中配置,HttpSessionBindingListener虽然叫做监听器,但使用方法与HttpSessionListener完全不同。我们实际看一下它是如何使用的。新建类OnlineUserBindingListener,实现HttpSessionBindingListener接口,构造方法传入username参数,HttpSessionBindingListener内有两个方法valueBound(HttpSessionBindingEvent event)和valueUnbound(HttpSessionBindingEvent event),前者为数据绑定,后者为取消绑定所谓对session进行数据绑定,就是调用session.setAttribute()把HttpSessionBindingListener保存进session中

index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%>              My JSP 'index.jsp' starting page	
HttpSessionBindingListener方式监听Session:
登陆:

sessionBindingLogin.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@page import="listener.OnlineBindingListener"%><%	request.setCharacterEncoding("UTF-8");	// 取得登录的用户名	String username = request.getParameter("username");	// 把用户名放入在线列表    session.setAttribute("onlineUserBindingListener", new OnlineBindingListener(username));	// 成功	response.sendRedirect("result.jsp");%>

package listener;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import javax.servlet.ServletContext;import javax.servlet.http.HttpSession;import javax.servlet.http.HttpSessionBindingEvent;import javax.servlet.http.HttpSessionBindingListener;public class OnlineBindingListener implements HttpSessionBindingListener {		String username;        public OnlineBindingListener(String username){        this.username=username;    }    public void valueBound(HttpSessionBindingEvent event) {        HttpSession session = event.getSession();        System.out.println("创建Session:"+session.getId());        System.out.println("username:"+username);                session.setAttribute("username", username);                ServletContext application = session.getServletContext();        // 把用户名放入在线列表        List onlineUserList = (List) application.getAttribute("onlineUserList");        Map
sessionMap = (Map
)application.getAttribute("sessionMap"); // 第一次使用前,需要初始化 if (onlineUserList == null) { onlineUserList = new ArrayList(); application.setAttribute("onlineUserList", onlineUserList); } if (sessionMap == null) { sessionMap = new HashMap
(); application.setAttribute("sessionMap", sessionMap); } onlineUserList.add(this.username); sessionMap.put(username, session); } public void valueUnbound(HttpSessionBindingEvent event) { HttpSession session = event.getSession(); ServletContext application = session.getServletContext(); // 从在线列表中删除用户名 List onlineUserList = (List) application.getAttribute("onlineUserList"); onlineUserList.remove(this.username); System.out.println("Session实效:"+session.getId()); System.out.println(this.username + "退出。"); }}
把某人踢出登陆状态:

deleteUser.jsp

<%@ page language="java" import="java.util.*,javax.servlet.*" pageEncoding="UTF-8"%><%	request.setCharacterEncoding("UTF-8");	// 取得登录的用户名	String username = request.getParameter("username");	System.out.println(username);	Map
sessionMap = (Map
)application.getAttribute("sessionMap"); HttpSession otherSession = (HttpSession)sessionMap.get(username); //otherSession.removeAttribute("username"); otherSession.invalidate(); sessionMap.remove(username); // 成功 response.sendRedirect("result.jsp");%>

转载地址:http://uplpi.baihongyu.com/

你可能感兴趣的文章
校招面试时如何做项目介绍
查看>>
分布式和微服务理解
查看>>
面试时会问到的项目中的问题总汇
查看>>
Netty有什么用?
查看>>
HashMap为什么2倍扩容
查看>>
详解 MySql InnoDB 中的三种行锁(记录锁、间隙锁与临键锁)
查看>>
解决docker 启动 centos 镜像,容器会自动退出问题
查看>>
ftp文件出现乱码
查看>>
ES安装启动及could not find java in bundled jdk at /opt/elasticsearch/elasticsearch-7.9.1/jdk/bin/java报错
查看>>
什么是脑裂?Zookeeper怎么解决脑裂问题的?
查看>>
redis加锁的几种方法
查看>>
什么是RPC?RPC与Stub简述
查看>>
什么是EJB?EJB详解
查看>>
java进程间通信的几种方式? 对比总结
查看>>
报错org.thymeleaf.exceptions.TemplateInputException: Error resolving template解决方案
查看>>
启动项目报错:org.apache.catalina.LifecycleException: Failed to start component
查看>>
BindingResult是什么?BindingResult的使用方法详解
查看>>
linux关闭防火墙了,但端口还是访问不了/虚拟机能ping通,但是telnet某个端口却不行
查看>>
StringBuffer的扩容机制为什么是两倍的原数组长度 + 2
查看>>
Java的double和float类型计算丢失精度问题,bigdecimal用法
查看>>