[Author:Topcss - Time:09.7.13]
上次贴伪代码时,有不少人说想要源码,今天抽时间写了一个。
概念:
所谓“单用户单账户登录”是指:在同一系统中,一个用户名不能在两个地方同时登录。
我们参照
QQ
实现效果:
当某账号在
A
处登录后,在未退出的情况下,如果再到
B
处登录,那么,系统会挤下
A
处登录的账号。
先看看伪代码:
http://www.iteye.com/post/1049924
,因为我会按照这个流程来实现。
环境:
Tomcat 6
,
jdk6
,
MyEclipse7
Struts1.2+Hibernate+Spring
好,开工:
第一步:搭架子,把
SSH
整合起来。参照:
http://sites.google.com/site/topcss/struts-spring-hibernate-de-ji-cheng
第二步:编写代码
1
、编写在线用户类:
package
net.jiakuan.books.common;
import
java.util.HashMap
;
import
java.util.Map
;
public
class
OnlineUserMap
{
public
static
Map<String
, String
>
onlineuser = new
HashMap<String
, String
>();
/**
*
得到在线用户
* @return
*/
public
static
Map<String
, String
>
getOnlineuser()
{
return
onlineuser;
}
/**
*
添加在线用户
* @param sessionId
* @param userName
* @return
*/
public
void
addOnlineUser(String
userId, String
sessionId)
{
onlineuser.put(userId,
sessionId);
}
/**
*
得到sessionId
* @param userName
* @return
*/
public
String
getSessionId(String
userName)
{
return
onlineuser.get(userName);
}
/**
*
判断用户是否登录
* @param name
* @return
*/
public
boolean
isLogin(String
userName)
{
return
onlineuser.containsKey(userName);
}
/**
*
移除用户
* @param userName
*/
public
void
removeUser(String
userName)
{
onlineuser.remove(userName);
}
}
2
、系统参数类
package
net.jiakuan.books.common;
public
class
SystemParameter
{
public
static
final
String
SESSION_USER_NAME = "loginUser"
; // SESSION
中的键名
}
3
、
Session
监听器
package
net.jiakuan.books.webs.listener;
import
javax.servlet.http.HttpSessionAttributeListener;
import
javax.servlet.http.HttpSessionBindingEvent;
import
net.jiakuan.books.common.OnlineUserMap;
import
net.jiakuan.books.common.SystemParameter;
public
class
UserLoginListener implements
HttpSessionAttributeListener
{
public
void
attributeAdded(HttpSessionBindingEvent evt)
{
String
username = evt.getName();
String
sessionId = evt.getSession().getId();
if
(username == SystemParameter.SESSION_USER_NAME)
{
new
OnlineUserMap().addOnlineUser(username,
sessionId);
}
}
public
void
attributeRemoved(HttpSessionBindingEvent evt)
{
String
username = evt.getName();
String
sessionId = evt.getSession().getId();
if
(username == SystemParameter.SESSION_USER_NAME)
{
OnlineUserMap
online = new
OnlineUserMap();
if
(online.isLogin(username)
&&
online.getSessionId(username).equals(sessionId))
{
online.removeUser(username);
}
}
}
}
4
、过滤器
[
代码完全参照“伪代码”编写,所以没写注释。
]
package
net.jiakuan.books.webs.filters;
import
java.io.IOException
;
import
javax.servlet.Filter;
import
javax.servlet.FilterChain;
import
javax.servlet.FilterConfig;
import
javax.servlet.ServletException;
import
javax.servlet.ServletRequest;
import
javax.servlet.ServletResponse;
import
javax.servlet.http.HttpServletRequest;
import
javax.servlet.http.HttpServletResponse;
import
javax.servlet.http.HttpSession;
import
net.jiakuan.books.common.OnlineUserMap;
import
net.jiakuan.books.common.SystemParameter;
import
net.jiakuan.books.models.Users;
public
class
LoginFilter implements
Filter
{
public
void
doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain
chain) throws
IOException
,
ServletException
{
HttpServletRequest
request = (HttpServletRequest)arg0;
HttpServletResponse
response = (HttpServletResponse)arg1;
String
fn = request.getParameter("fn"
);
if
(fn != null
&& !""
.equals(fn)
&& !fn.equalsIgnoreCase("login"
))
{
HttpSession
session = request.getSession();
Object
obj =
session.getAttribute(SystemParameter.SESSION_USER_NAME);
if
(obj != null
)
{
String
username = ((Users)obj).getName();
OnlineUserMap
online = new
OnlineUserMap();
if
(online.isLogin(username))
{
if
(session.getId().equals(online.getSessionId(username)))
{
chain.doFilter(arg0,
arg1);
}
else
{
response.getWriter().print("<script>window.location.href='common/login.jsp'</script>"
);
}
}
else
{
response.getWriter().print("<script>window.location.href='common/login.jsp'</script>"
);
}
}
else
{
response.getWriter().print("<script>window.location.href='common/login.jsp'</script>"
);
}
}
else
{
chain.doFilter(arg0,
arg1);
}
}
}
5
、
Action
里面的
2
个方法
package
net.jiakuan.books.webs.actions;
import
javax.servlet.http.HttpServletRequest;
import
javax.servlet.http.HttpServletResponse;
import
net.jiakuan.books.bll.face.IUsersBll;
import
net.jiakuan.books.common.OnlineUserMap;
import
net.jiakuan.books.common.SystemParameter;
import
net.jiakuan.books.models.Users;
import
net.jiakuan.books.webs.forms.UsersForm;
import
org.apache.struts.action.ActionForm;
import
org.apache.struts.action.ActionForward;
import
org.apache.struts.action.ActionMapping;
import
org.apache.struts.actions.DispatchAction;
public
class
UserAction extends
DispatchAction
{
IUsersBll
usersBll;
/***
*
登录
*/
public
ActionForward login(ActionMapping mapping,
ActionForm form,
HttpServletRequest
request, HttpServletResponse response)
throws
Exception
{
// 1.
得到用户输入
UsersForm
usersform = (UsersForm)form;
// 2. new
用户并设值
Users
users = new
Users();
users.setLoginId(usersform.getUsers().getLoginId());
users.setLoginPwd(usersform.getUsers().getLoginPwd());
// 3.
调用业务逻辑层验证账户的有效性
Users
result = this
.usersBll.login(users);
if
(result != null
)
{
//
验证状态
if
(result.getUserStates().getId() == 1)
{
request.getSession().setAttribute(SystemParameter.SESSION_USER_NAME,
result);
//
把当前登录用户添加到在线用户Map
中
new
OnlineUserMap().addOnlineUser(result.getName(),
request.getSession().getId());
return
mapping.findForward("user"
);
}
else
{
return
mapping.findForward("error"
);
}
}
else
{
return
mapping.findForward("error"
);
}
}
/***
*
退出登录
*/
public
ActionForward exit(ActionMapping mapping,
ActionForm form,
HttpServletRequest
request, HttpServletResponse response)
throws
Exception
{
request.getSession().removeAttribute(SystemParameter.SESSION_USER_NAME);
return
mapping.findForward("index"
);
}
public
void
setUsersBll(IUsersBll usersBll)
{
this
.usersBll = usersBll;
}
}
把核心代码都贴上来了,限于篇幅其他代码不在赘述。
如果对代码中有什么疑惑,可以通过
topcss@gmail.com
找到我。
分享到:
相关推荐
这个"基于SSH的个人银行账户管理系统"是一个完整的项目实例,它涵盖了从设计到实现的全过程,包括数据库设计、前端界面、后端业务逻辑以及与用户的交互功能。以下是对该项目中涉及的主要知识点的详细解释: 1. SSH...
本系统——"基于SSH银行管理系统",是一个完整的银行业务流程模拟平台,旨在提供全方位的银行业务服务,如账户管理、存款取款、转账等。下面我们将深入探讨SSH框架的核心概念以及在银行管理系统中的应用。 首先,...
这些视频可能涵盖了从安装环境到配置SSH框架,再到开发和部署博客系统的全过程。 6. **学习价值**:这样的博客系统对于初学者来说,是一个很好的实践项目,可以深入理解SSH框架的集成和工作原理,提升Web开发技能。...
总之,"3.7javaEE_SSH_MySql基于SSH的医院在线挂号"项目是一个全面的Web开发实践,涵盖了从用户界面到数据库设计的全过程,对于提升开发者在JavaEE领域的技能具有重要意义。通过学习和实践,开发者不仅能掌握SSH框架...
前台用户可以注册账户,通过登录后可以享受在线音乐播放服务,搜索功能允许用户根据歌曲名和歌手信息检索音乐资源。用户还可以在网站上留言,与站长或其他用户进行互动。后台管理员则拥有更高的权限,可以进行音乐...
本实训报告主要探讨了基于SSH(Struts、Spring、Hibernate)框架的运动社区系统的实现,这是在郑州轻工业学院软件学院进行的一项实践活动。报告详细介绍了系统从需求分析到功能实现的全过程,旨在提升学生的Java技术...
作为计算机毕业设计项目,这个系统体现了学生对Java Web开发的理解和实践能力,涵盖了从前端界面设计到后端服务实现的全过程。同时,它还可能包括系统需求分析、数据库设计、性能优化等方面的考虑,是一次综合性的...
该项目是一个综合性的Web应用,基于SSH(Spring、Struts2、Hibernate)框架,结合Maven构建工具和Bootstrap前端框架,实现了完整的权限管理和用户登录注册功能。以下是对该项目中涉及的关键技术点的详细解释: 1. *...
【标题】"bank.zip_bank ssh_java_ssh_ssh银行_银行管理系统" 指的是一款基于SSH框架开发的银行账目管理系统,该系统集成了多种功能,适用于处理银行日常业务操作。SSH是一个流行的企业级Web应用程序开发框架,由...
总结来说,这篇毕业论文详细记录了使用JSP和SSH框架开发网上购物系统的全过程,不仅展现了作者对相关技术的掌握,也展示了软件工程方法论在实际项目中的应用。通过这个系统,我们可以看到电子商务解决方案是如何结合...
《基于SSH2框架技术的网上购餐平台设计与实现》 该毕业论文的主题聚焦于使用SSH2(Struts2 + Hibernate + Spring)框架构建一个网上购餐平台。SSH2是Java Web开发中的一种流行框架组合,它为开发高效、可维护的Web...
这个答辩PPT的学习教案详细介绍了SSH框架在开发客户关系管理系统中的应用,涵盖了从开发环境的选择、框架原理到实际项目实施的全过程,对于学习和理解SSH框架及其在实际项目中的运用具有很高的参考价值。同时,它也...
5. **权限控制**:为了保护用户隐私,系统应具备用户登录和权限验证机制,每个用户只能查看和管理自己的收支记录。 6. **数据备份与恢复**:为防止数据丢失,系统需支持定期备份数据,并提供数据恢复功能。 在系统...
* 用户管理:能够管理用户的账户信息和视频观看记录。 六、业务流程分析 基于移动端的有偿视频网站的业务流程包括以下几个步骤: * 用户注册:用户注册账户后,能够登录网站。 * 视频上传:用户可以上传视频到...
系统架构基于Java的SSH2框架,即Spring、Struts2和Hibernate的组合,采用MVC(Model-View-Controller)模式,实现了业务逻辑、数据处理和用户界面的分离。在前端,使用JavaScript、HTML和CSS构建动态交互的页面,...
《水果销售商城系统+论文+源码:基于jsp ssh mvc的java web j2ee实践》 本项目是一个完整的水果销售商城系统,旨在为毕业生提供一个深入理解和实践Java Web开发的平台。它采用SSH(Spring、Struts、Hibernate)框架...
毕业论文《保健品销售购物网站ssh.doc...该论文详细阐述了从项目构思到实现的全过程,涵盖了需求分析、系统设计、技术选型、数据库设计、测试等多个关键步骤,对于理解SSH技术在电子商务领域的应用具有一定的参考价值。
综上所述,本文档详细介绍了基于JSP和SSH框架的昆山保时捷汽车销售管理系统的开发过程,涵盖了从需求分析到系统测试的全过程,展示了如何利用现代信息技术提升汽车销售领域的业务效率和服务质量。
SSH框架可以提供强大的数据访问和页面展示能力,同时Spring的安全特性可以保障用户账户的安全。 4. **SSH整合**:Spring、Struts和Hibernate是Java开发中常见的三大开源框架。它们的整合可以简化开发过程,提高代码...
毕业论文《jsp952饭卡管理系统ssh》深入探讨了基于Java Web技术的饭卡管理系统的设计与实现。本文档详细阐述了系统开发的全过程,涵盖了从项目背景、现状分析到功能设计、数据库构建等多个关键环节。 1. 研究背景:...