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. 整合Struts2与Spring

    一.需要的JAR文件为:Spring和Struts2框架本身需要的JAR文件以及他们所依赖的JAR文件

  2. 012——数组(十二) 数组range array_count_values array_pad array_product

    <?php /*range () 生成包含指定范围的数组,第三个参数是步长值 */ /*$arr=range(1,10,2); print_r($arr);//输出:Array ( [0] =& ...

  3. 怎样安装 OpenJDK 8 in Ubuntu 14.04 & 12.04 LTS

    OpenJDK Java 8 has been made into official Ubuntu repositories for 14.10 Utopic and higher. For Ubun ...

  4. 老鼠走迷宫(2)输出所有路径(C语言)

    需求 有一个迷宫,在迷宫的某个出口放着一块奶酪.将一只老鼠由某个入口处放进去,它必须穿过迷宫,找到奶酪.请找出它的行走路径. STEP 1 题目转化 我们用一个二维数组来表示迷宫,用2表示迷宫的墙壁, ...

  5. TotoiseSVN的使用方法

    详细教程 https://www.jianshu.com/p/6b3b7b915332 SVN提交修改 https://jingyan.baidu.com/article/6c67b1d6f524d5 ...

  6. Jquery如何获取ASP.NET服务器控件的值

    关键字: Jquery 服务器控件 获取值 由于ASP.NET网页运行后,服务器控件会随机生成客户端id,jquery获取时候不太好操作,总结有以下3种方法:   服务器控件代码:<asp:Te ...

  7. CS231n课程笔记翻译2:图像分类笔记

    译者注:本文智能单元首发,译自斯坦福CS231n课程笔记image classification notes,由课程教师Andrej Karpathy授权进行翻译.本篇教程由杜客翻译完成.Shiqin ...

  8. JAVA怎么在函数内改变传入的值

    public class TestInt { public int aa(int i) { return i+4; } public static void main(String [] args) ...

  9. web前端开发中的命名规范

      (一)主体 头:header 内容:content/container 尾:footer 导航:nav 侧栏:sidebar 栏目:column 页面外围控制整体布局宽度:wrapper 左右中: ...

  10. PHP 时间戳 转时间 for ios 8*3600

    // 时间戳 转时间 int intTimeString = [_model.date intValue]; NSDate *confromTimesp = [NSDate dateWithTimeI ...