listener单点登录和在线人数
1,jsp提交一个form
2,把收集到的数据放到一个personInfo类中,personInfo类放进session中
3,添加的时候触发listener,把一个personInfo的account为key ,session为value,放进一个map中,如果在map找到了这个session,
证明他已经登陆了,把他弄下线。map重新添加
计算在线人数用一个装满常量的类
1,map的size()就是在线的人数
登陆页面jsp
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@ page import="listen.PersonInfo"%>
<%
String action = request.getParameter("action");
String account = request.getParameter("account"); if ("login".equals(action) && account.trim().length() > 0) {
PersonInfo personInfo = new PersonInfo();
personInfo.setAccount(account);
personInfo.setIp(request.getRemoteAddr());
personInfo.setLoginDate(new java.util.Date());
session.setAttribute("personInfo", personInfo);
response.sendRedirect(response.encodeRedirectURL(request
.getRequestURI()));
return;
} else if ("logout".equals(action)) {
System.out.println("outout");
session.removeAttribute("personInfo");
response.sendRedirect(response.encodeRedirectURL(request
.getRequestURI()));
return;
}
%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<%
if (session.getAttribute("personInfo") != null) {
%>
欢迎你, ${personInfo.account }.
<br /> 你的登陆ip, ${personInfo.ip }.
<br /> 登陆时间 , ${personInfo.loginDate }.
<a href="${contextPage.request.requestURI }?action=logout">退出</a>
<script>
setTimeout("location=location;", 5000);
</script>
<%
} else {
%>
${msg }
<form action="${contextPage.request.requestURI }?action=login"
method="post">
账号: <input name="account" /> <input type="submit" value="登陆">
<from /> <%
}
%> </body>
</html>
单点登录
package listen; import java.util.HashMap;
import java.util.Map; import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; public class LoginSessionListener implements HttpSessionAttributeListener { Log log = LogFactory.getLog(this.getClass());
Map<String, HttpSession> map = new HashMap<String, HttpSession>(); @Override
public void attributeAdded(HttpSessionBindingEvent event) {
// TODO Auto-generated method stub
String name = event.getName();
if (name.equals("personInfo")) {
PersonInfo personInfo = (PersonInfo) event.getValue();
if (map.get(personInfo.getAccount()) != null) {
HttpSession session = map.get(personInfo.getAccount());
PersonInfo oldPersonInfo = (PersonInfo) session
.getAttribute("personInfo");
log.info("账号: " + oldPersonInfo.getAccount() + "被迫下线");
session.removeAttribute("personInfo");
session.setAttribute("msg", "你的账号被其他机器登陆了");
}
map.put(personInfo.getAccount(), event.getSession());
log.info("账号:" + personInfo.getAccount() + "在" + personInfo.getIp()
+ "登陆");
}
} @Override
public void attributeRemoved(HttpSessionBindingEvent event) {
// TODO Auto-generated method stub
String name = event.getName();
if ("personInfo".equals(name)) {
PersonInfo personInfo = (PersonInfo) event.getValue();
log.info("账号" + personInfo.getAccount() + "注销");
}
} @Override
public void attributeReplaced(HttpSessionBindingEvent event) {
// TODO Auto-generated method stub } }
在线人数
package listen; import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener; public class MySessionListener implements HttpSessionListener,
HttpSessionAttributeListener { @Override
public void sessionCreated(HttpSessionEvent se) {
// TODO Auto-generated method stub
Count.TOTAL_HISTORY_COUNT++;// 总访问人数加一
Count.SESSION_MAP.put(se.getSession().getId(), se.getSession());// 放进去
if (Count.SESSION_MAP.size() > Count.MAX_ONLINE_COUNT) {
Count.MAX_ONLINE_COUNT = Count.SESSION_MAP.size();
}
} @Override
public void sessionDestroyed(HttpSessionEvent se) {
// TODO Auto-generated method stub
HttpSession session = se.getSession();
Count.SESSION_MAP.remove(session.getId());
} @Override
public void attributeAdded(HttpSessionBindingEvent event) {
// TODO Auto-generated method stub
if ("personInfo".equals(event.getName())) {
Count.CURRENT_LOGIN_COUNT++;// 当前在线人数加一
HttpSession session = event.getSession();
}
} @Override
public void attributeRemoved(HttpSessionBindingEvent event) {
// TODO Auto-generated method stub
if (event.getName().equals("personInfo")) {
Count.CURRENT_LOGIN_COUNT--;
}
} @Override
public void attributeReplaced(HttpSessionBindingEvent event) {
// TODO Auto-generated method stub } }
listener单点登录和在线人数的更多相关文章
- 单点登录的原理与CAS技术的研究
1.什么是单点登录? 关于单点登录技术的说明参考文章:http://www.cnblogs.com/yupeng/archive/2012/05/24/2517317.html 一般来说,整个原理大家 ...
- CAS 4.0 单点登录教程
CAS 单点登录指导文档 1.概述 单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一.SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所 ...
- CAS单点登录实践(spring cas client配置)
前言: 最近的项目需要将多个站点统一登录,查阅了资料Jasig cas(Central Authentication Service)(官方站点:http://www.jasig.org/cas)使用 ...
- CAS FOR WINDOW ACTIVE DIRECTORY SSO单点登录
一.CAS是什么? CAS(Central Authentication Service)是 Yale 大学发起的一个企业级的.开源的项目,旨在为 Web 应用系统提供一种可靠的单点登录解决方法(支持 ...
- cas单点登录搭建
Cas Server下载:http://developer.jasig.org/cas/ Cas Client下载:http://developer.jasig.org/cas-clients/ 测试 ...
- SSO之CAS单点登录实例演示
本文目录: 一.概述 二.演示环境 三.JDK安装配置 四.安全证书配置 五.部署CAS-Server相关的Tomcat 六.部署CAS-Client相关的Tomcat 七. 测试验证SSO 一.概述 ...
- SSO单点登录Spring-Security & CAS使用手册
1.1概述 1.1.1单点登录介绍 单点登录(Single Sign On , 简称 SSO )是目前比较流行的服务于企业业务整合的解决方案之一, SSO 使得在多个应用系统中,用户只需要登录一次就可 ...
- CAS单点登录和spring securtiy集成
说明:本文章主要建立在spring-security早已集成在系统中的前提下: 1.需要创建一个spring-security.xml文件并关联在applicationContext.xml文件中:& ...
- 搭建CAS单点登录服务器
最近公司的一个项目需要用到单点登录的功能,之前对单点登录了解得不多.于是网上找了下单点登录的解决方案,发现CAS是个不错的解决方案.于是搭个环境测试了一下.这里记录下测试的详细步骤. 官网:http: ...
随机推荐
- POJ 1160 经典区间dp/四边形优化
链接http://poj.org/problem?id=1160 很好的一个题,涉及到了以前老师说过的一个题目,可惜没往那上面想. 题意,给出N个城镇的地址,他们在一条直线上,现在要选择P个城镇建立邮 ...
- yii2的定时任务
php yii minsheng-cancel-account/cancel-applied-account
- springboo 添加logback日志
springboot默认引入logback相关的jar包 1.在 Application.properties里添加 logging.config=classpath:logback-spring.x ...
- OpenStack Mitaka Neutron SR-IOV配置
### 一.在所有节点(控制节点.计算节点) 1.修改BIOS ``` BOIS里面开启SR-IOV功能 开启 VT-d (inter virtualization technology)和 SR-I ...
- hdu1814
题解: 2-sat nm暴力 虽然似乎复杂度最低 代码: #include<cstdio> #include<cmath> #include<algorithm> ...
- LeetCode OJ:Add and Search Word - Data structure design(增加以及搜索单词)
Design a data structure that supports the following two operations: void addWord(word) bool search(w ...
- 求小于等于k长度的最大区间和
题意 给出一个序列,求长度小于等于k的最大区间和并输出起点和终点 1<=n<=100000 1<=k<=n 题解:先算出前缀和,利用单调队列的性质,在单调队列中存储sum[ ...
- vue.js 源代码学习笔记 ----- instance render
/* @flow */ import { warn, nextTick, toNumber, _toString, looseEqual, emptyObject, handleError, loos ...
- cpu的用户态和内核态和内存的用户空间内核空间
谈到CPU的这两个工作状态,也就是处理器的这两个工作状态,那我们有必要说一下为什么搞出这两个鬼玩意出来. 用过电脑的娃娃们肯定知道在一个系统中既有操作系统的程序,也由普通用户的程序.但那么 ...
- paddlepaddle初步印象
从其官网整理了一些资料如下: 1.基本概念 基本使用概念 PaddlePaddle是源于百度的一个深度学习平台.PaddlePaddle为深度学习研究人员提供了丰富的API,可以轻松地完成神经网络配置 ...