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单点登录和在线人数的更多相关文章

  1. 单点登录的原理与CAS技术的研究

    1.什么是单点登录? 关于单点登录技术的说明参考文章:http://www.cnblogs.com/yupeng/archive/2012/05/24/2517317.html 一般来说,整个原理大家 ...

  2. CAS 4.0 单点登录教程

    CAS 单点登录指导文档 1.概述 单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一.SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所 ...

  3. CAS单点登录实践(spring cas client配置)

    前言: 最近的项目需要将多个站点统一登录,查阅了资料Jasig cas(Central Authentication Service)(官方站点:http://www.jasig.org/cas)使用 ...

  4. CAS FOR WINDOW ACTIVE DIRECTORY SSO单点登录

    一.CAS是什么? CAS(Central Authentication Service)是 Yale 大学发起的一个企业级的.开源的项目,旨在为 Web 应用系统提供一种可靠的单点登录解决方法(支持 ...

  5. cas单点登录搭建

    Cas Server下载:http://developer.jasig.org/cas/ Cas Client下载:http://developer.jasig.org/cas-clients/ 测试 ...

  6. SSO之CAS单点登录实例演示

    本文目录: 一.概述 二.演示环境 三.JDK安装配置 四.安全证书配置 五.部署CAS-Server相关的Tomcat 六.部署CAS-Client相关的Tomcat 七. 测试验证SSO 一.概述 ...

  7. SSO单点登录Spring-Security & CAS使用手册

    1.1概述 1.1.1单点登录介绍 单点登录(Single Sign On , 简称 SSO )是目前比较流行的服务于企业业务整合的解决方案之一, SSO 使得在多个应用系统中,用户只需要登录一次就可 ...

  8. CAS单点登录和spring securtiy集成

    说明:本文章主要建立在spring-security早已集成在系统中的前提下: 1.需要创建一个spring-security.xml文件并关联在applicationContext.xml文件中:& ...

  9. 搭建CAS单点登录服务器

    最近公司的一个项目需要用到单点登录的功能,之前对单点登录了解得不多.于是网上找了下单点登录的解决方案,发现CAS是个不错的解决方案.于是搭个环境测试了一下.这里记录下测试的详细步骤. 官网:http: ...

随机推荐

  1. torch 深度学习(3)

    torch 深度学习(3) 损失函数,模型训练 前面我们已经完成对数据的预处理和模型的构建,那么接下来为了训练模型应该定义模型的损失函数,然后使用BP算法对模型参数进行调整 损失函数 Criterio ...

  2. Shell_NotifyIcon托盘图标闪烁

    之前的同事留下了一个程序会莫名闪退的bug,今天终于发现是托盘图标闪烁使得gdi资源耗尽导致的. 先定义 #include "shellapi.h" //托盘图标引用 NOTIFY ...

  3. 局部标签(gcc对c的扩展)

    每个语句内嵌表达式都是一个可以声明局部跳转标签的域.一个局部标签只是一个标识符:你可以使用通常的goto语句跳到它--但是只能在它所属的域内这么做.一个局部标签的申明如下:__label__ labe ...

  4. 解决spring boot在RabbitMQ堆积消息情况下无法启动问题

    最近遇到一个问题,服务站点上线之前,先去新建需要的rabbitmq并绑定关系,此时 如果发送消息方运行, 那边会造成新建的q消息部分堆积得不到及时消费 那么问题来了? 在消息堆积情况下,服务站点无法启 ...

  5. windows使用pip安装selenium报错问题

    UnicodeDecodeError: 'ascii' codec can't decode byte 0xb9 in position 7: ordinal not in range(128) 这是 ...

  6. Netty实例几则

    Netty是基于JDK NIO的网络框架 简化了NIO编程, 不用程序自己维护selector, 将网络通信和数据处理的部分做了分离 多用于做底层的数据通信, 心跳检测(keepalived) 1. ...

  7. 使用IScroll5实现滚动

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. [VS]VS快捷键

    VS快速跳到某一行:CTRL+G VS鼠标移动到下一个高亮处:Ctrl+Shift+上下箭头 VS转到定义后返回:Ctrl+- VS折叠全部代码:Ctrl.M+Ctrl.O VS代码格式化:Ctrl. ...

  9. 关于Qt中使用线程的时候函数具体在哪个线程中运行的问题

    在子线程中,run函数中以及其中调用的都在单独的子线程里面运行,但是其他的类似构造函数之流都是在主线程里面运行的,不要搞混了

  10. Windows平台编程涉及的函数

    VirtualAlloc 调用进程的虚拟地址空间 GetTickCount 返回从操作系统启动到当前所经历过的毫秒数 malloc.h内存分配函数,需要头文件malloc.h