java web之Listener实现单态登录
来源:互联网 发布:工业手持数据采集终端 编辑:程序博客网 时间:2024/05/24 06:18
废话不说,直接上代码!
登录与注销动作都在该JSP中完成。
<span style="font-size:18px;"><%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <jsp:directive.page import="com.wang.singleton.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)){ session.removeAttribute("personInfo"); response.sendRedirect(response.encodeRedirectURL(request.getRequestURI())); return; } %><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body><c:choose><c:when test="${ personInfo != null}">欢迎您,${personInfo.account}<br/>您的登录ip为,${personInfo.ip}<br>登录时将为,<fmt:formatDate value="${personInfo.loginDate}" pattern="yyyy-MM-dd HH:mm"/><br/><a href="${pageContext.request.requestURI}?action=logout">退出</a><!-- 每五秒钟刷新一次页面 --><script>setTimeout("location=location;", 5000);</script></c:when><c:otherwise>${msg}<c:remove var="msg" scope="session"/><form action="${pageContext.request.requestURI}?action=login" method="post">账号:<input name="account"><input type="submit" value="登录"></form></c:otherwise></c:choose></body></html></span>personInfo java bean
package com.wang.singleton;import java.io.Serializable;import java.util.Date;public class PersonInfo implements Serializable{private static final long serialVersionUID = 1L;private String account;private String ip;private Date loginDate;public String getAccount() {return account;}public void setAccount(String account) {this.account = account;}public String getIp() {return ip;}public void setIp(String ip) {this.ip = ip;}public Date getLoginDate() {return loginDate;}public void setLoginDate(Date loginDate) {this.loginDate = loginDate;}public boolean equals(Object obj){if(obj == null || !(obj instanceof PersonInfo)){return false;}return account.equalsIgnoreCase(((PersonInfo) obj).getAccount());}}以下Listener用于实现单态登录
package com.wang.singleton;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 <strong>HttpSessionAttributeListener</strong> { Log log= LogFactory.getLog(this.getClass()); Map<String,HttpSession> map = new HashMap<String,HttpSession>(); public LoginSessionListener() { // TODO Auto-generated constructor stub } public void attributeRemoved(HttpSessionBindingEvent event) { // 删除属性前被调用 String name = event.getName(); if(name.equals("personInfo")){ PersonInfo personInfo = (PersonInfo) event.getValue(); map.remove(personInfo.getAccount()); log.info("账号"+personInfo.getAccount()+"注销"); } } public void attributeAdded(HttpSessionBindingEvent event) { // 添加session时被调用 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()+"在"+oldPersonInfo.getIp()+"已经登录,该登录将被迫下线!"); session.removeAttribute("personInfo"); session.setAttribute("msg", "您的账号已经在其他机器上登录,您被迫下线!"); } map.put(personInfo.getAccount(), event.getSession()); log.info("账号"+personInfo.getAccount()+"在"+personInfo.getIp()+"登录"); } } public void attributeReplaced(HttpSessionBindingEvent event) { // 修改属性时被调用 String name = event.getName(); if(name.equals("personInfo")){ PersonInfo oldPersonInfo = (PersonInfo) event.getValue(); //移除旧的登录信息 map.remove(oldPersonInfo.getAccount()); //新的登录信息 PersonInfo personInfo = (PersonInfo) event.getSession().getAttribute("personInfo"); //也要检查新的账号是否在别的机器上登录 if(map.get(personInfo.getAccount()) != null){ HttpSession session = map.get(personInfo.getAccount()); session.removeAttribute("personInfo"); session.setAttribute("msg", "您的账号已经在其他机器上登录,您被迫下线!"); } map.put(personInfo.getAccount(), event.getSession()); log.info("账号"+personInfo.getAccount()+"在"+personInfo.getIp()+"登录"); } }}web.xml
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>loginListener</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <listener> <listener-class>com.wang.singleton.LoginSessionListener</listener-class> </listener></web-app>注意:本例中Listener与登录模块等没有代码耦合。
源代码地址:http://download.csdn.net/detail/wangxuewei111/8530549
0 0
- java web之Listener实现单态登录
- Listener模拟单态登录
- JAVA Web开发之Servlet-20.Listener
- JAVA Web开发之Servlet-20.Listener
- Java Web之三 Servlet Filter Listener
- java web之监听器Listener初识
- web组件之Listener
- java web listener 监听器
- java web listener 监听器
- Java Web监听器Listener
- java web listener 监听器
- java web 监听器listener
- java web listener 监听器
- java web笔记之Listener显示在线用户
- Java Web基础知识之Listener:监控Servlet的每个动作
- Java Web 之 Servlet - Listener、Filter、Decorator 精辟
- Web.xml配置之listener
- java web中使用 Listener
- 选择排序......
- 解决Android导入新项目时Android.jar包丢失问题
- 《Effective C++》学习笔记——条款29
- 原生ajax
- 设置jvm内存与tomcat内存方法
- java web之Listener实现单态登录
- Floyd算法(所有点对最短路径)
- [C++]Saving the Universe——Google Code Jam Qualification Round 2008
- 多线程问题及处理
- 一切小知识点,可能不知道原因
- 第三单元3.22作业
- 为什么Java字符串是不可变对象
- 简析TCP的三次握手与四次分手
- POI教程