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: ...
随机推荐
- [转]RGB数据保存为BMP图片
转自:http://blog.csdn.net/yixianfeng41/article/details/52591585 一.BMP文件由文件头.位图信息头.颜色信息和图形数据四部分组成. 1.BM ...
- HDU 5698 大组合数取模(逆元)
瞬间移动 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submis ...
- sql 多个字段分组,删除重复记录,保留ID最小的一条
IF OBJECT_ID('cardDetail') IS NOT NULL DROP TABLE cardDetail CREATE TABLE cardDetail ( id ,) PRIMARY ...
- [nodejs]解决mysql和连接池(pool)自动断开问题
最近在做一个个人项目,数据库尝试使用了mongodb.sqlite和mysql.分享一下关于mysql的连接池用法.项目部署于appfog,项目中我使用连接池链接数据库,本地测试一切正常.上线以后,经 ...
- Linux中awk后面的RS, ORS, FS, OFS 用法
Linux中awk后面的RS, ORS, FS, OFS 含义 一.RS 与 ORS 差在哪 我们经常会说,awk是基于行列操作文本的,但如何定义“行”呢?这就是RS的作用. 默认情况下,RS的 ...
- ie下的bug之button
场景描述: 现在页面设计是都喜欢自定义按钮样式,某日接收到页面发现在ie下有bug,上代码: <div> <button><span><a href=&quo ...
- (转)JAVA正则表达式语法大全
[正则表达式]文本框输入内容控制 整数或者小数:^[0-9]+\.{0,1}[0-9]{0,2}$ 只能输入数字:"^[0-9]*$". 只能输入n位的数字:"^\d{n ...
- ubuntu16安装git
执行一条命令就可以: sudo apt-get install git
- mailto web弹出outlook发送邮件
1. <pre name="code" class="html"><a href="Mailto:test@163.com?CC=t ...
- Objective C - 1 - 实现一个MessageBox.Show
@interface K3ViewController : UIViewController<UIAlertViewDelegate> @end #import "K3ViewC ...