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: ...
随机推荐
- Java多态性的理解2
多态的基础理解请参考:http://www.cnblogs.com/liujinhong/p/6003144.html Java的多态一直是我们理解的一个难点.在读过<深入理解Java虚拟机&g ...
- C# 获取命名空间对应的程序集位置
由于同名命名空间会被多个程序集使用,C#没有提供直接的方法(对象浏览器也不行)通过命名空间获得程序集位置,这样就不方便找到那些引用文件时什么. 那么可以在立即窗口,中断某个代码的时候,去查询类所在程序 ...
- 安装ectouch点击安装按钮无反应
首先按F12: 看看”控制台“或者”网络“是否说找不到页面404 如果出现404,则是/mobile/index.php?m=install&c=index&a=importing方法 ...
- 浅谈HTML中的块级元素和内联元素
一.基本概念 1.块级元素(block element):一般都从新行开始占据一定的矩形空间,可以设置其宽.高属性来改变矩形的大小.一般情况下块级元素可以包含内联元素和其它块级元素,但也有特殊如for ...
- 【WebGL】4.光源
光的类型:所有的光都是从THREE.Light继承,分为环境光THREE.AmbientLight,点光源PointLight,聚光灯THREE.SpotLight和方向光THREE.Directio ...
- FusionCharts制作实时刷新图
转自:http://yklovejava-163-com.iteye.com/blog/1889949 下面介绍的是用FusionCharts制作实时刷新图的过程(FusionCharts确实太好用了 ...
- MetaPost使用
简介 MetaPost是一种制图语言,由John D. Hobby开发. 如果你要学习它,可以去下面的网址看看. 官网:http://tug.org/metapost 权威手册:http://tug. ...
- 【PL/SQL编程】条件语句
1. if...then语句 if <condition_expression> then plsql_sentence; end if; declare -- Local variabl ...
- jQuery 滑动选项卡jQuery tabulous.js
A jQuery tabs module for todays web! 实例DEMO 运行一下 Documentation Tabulous.js can be used with any cont ...
- java正则匹配多个子字符串样例
文本内容: 上海市黄浦区瑞典江苏省无锡市广东省深圳市南山区 我希望分别将字符串中的省份,城市名,城区名匹配出来,如匹配不出来就默认放在省份中. public static HashMap<Str ...