博客
关于我
强烈建议你试试无所不能的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/

你可能感兴趣的文章
nano中设置脚本开机自启动
查看>>
动态库调动态库
查看>>
Kubernetes集群搭建之CNI-Flanneld部署篇
查看>>
k8s web终端连接工具
查看>>
手绘VS码绘(一):静态图绘制(码绘使用P5.js)
查看>>
手绘VS码绘(二):动态图绘制(码绘使用Processing)
查看>>
基于P5.js的“绘画系统”
查看>>
《达芬奇的人生密码》观后感
查看>>
论文翻译:《一个包容性设计的具体例子:聋人导向可访问性》
查看>>
基于“分形”编写的交互应用
查看>>
《融入动画技术的交互应用》主题博文推荐
查看>>
链睿和家乐福合作推出下一代零售业隐私保护技术
查看>>
Unifrax宣布新建SiFAB™生产线
查看>>
艾默生纪念谷轮™在空调和制冷领域的百年创新成就
查看>>
NEXO代币持有者获得20,428,359.89美元股息
查看>>
Piper Sandler为EverArc收购Perimeter Solutions提供咨询服务
查看>>
RMRK筹集600万美元,用于在Polkadot上建立先进的NFT系统标准
查看>>
JavaSE_day14 集合中的Map集合_键值映射关系
查看>>
异常 Java学习Day_15
查看>>
Mysql初始化的命令
查看>>