[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的购物开发系统 基于ssh的购物开发系统,基于ssh的购物开发系统,基于ssh的购物开发系统,基于ssh的购物开发系统,基于ssh的购物开发系统,
java开发项目基于SSH三大框架所编写的学生管理系统源代码,这是基于SSH三大框架所编写的学生管理系统(课设),MySql数据库,主要功能有: 管理员登入、学生信息的录入、学生成绩录入、课程信息录入、教师管理等。...
基于SSH的用户管理系统
javaweb 基于ssh框架开发的简单登录注册系统,亲测可用
该项目为一个基于SSH的注册登录系统,包括管理员用户和普通用户的登录,普通用户的CRUD操作; 运用javascript和css增强前端呈现效果; 基于的软件环平台为MyEclipse10.5,tomcat7.0,jdk1.7; SSH版本为Struts2,...
此文档介绍了基于SSH的用户注册登录系统设计与实现的完整过程,用Java代码编写,SSH为框架,数据库为SQL Server。是Java Web的实战项目。
基于SSH的人力资源管理系统的开发和设计开题报告.docx基于SSH的人力资源管理系统的开发和设计开题报告.docx基于SSH的人力资源管理系统的开发和设计开题报告.docx基于SSH的人力资源管理系统的开发和设计开题报告.docx...
这是一个基于ssh框架的系统,一些功能已实现但是对于研究ssh很有帮助。
基于ssh的用户管理系统,功能完善,供学习参考。
基于SSH的医院在线挂号基于SSH的医院在线挂号基于SSH的医院在线挂号基于SSH的医院在线挂号基于SSH的医院在线挂号基于SSH的医院在线挂号基于SSH的医院在线挂号基于SSH的医院在线挂号基于SSH的医院在线挂号基于SSH的...
基于SSH框架的飞机订票系统研究与实现.pdf基于SSH框架的飞机订票系统研究与实现.pdf基于SSH框架的飞机订票系统研究与实现.pdf基于SSH框架的飞机订票系统研究与实现.pdf基于SSH框架的飞机订票系统研究与实现.pdf基于...
此小项目基于java ssh框架开发,主要实现对用户以及每个用户所属的通讯录李彪进行增删改查的操作,适合初学ssh的人学习和参考
基于SSH开发的学生选课系统,完整功能,适合初学者研究学习。
基于SSH的商场管理系统,基于SSH的商场管理系统
用作毕业设计的一个基于SSH框架开发的系统(数据库脚本是基于Mysql的,如果要用其他数据库,脚本要稍微修改下)
基于ssh的个人银行账户管理系统的设计与实现,一整套,工程,数据库文件,word,ppt,直接运行,前后台,多种卡种,储蓄卡,黄山卡,信用卡申请,后台审批通过,绑定支付宝,html5特性,ajax
基于SSH实现登录的Demo,SSH基本框架搭建
基于ssh框架制作的登录实例,下载后将相应数据库配置好,即可运行。
基于SSH的在线招标系统源码基于SSH的在线招标系统源码基于SSH的在线招标系统源码基于SSH的在线招标系统源码基于SSH的在线招标系统源码基于SSH的在线招标系统源码基于SSH的在线招标系统源码基于SSH的在线招标系统源码...
完全基于SSH框架的房屋租赁系统,实现用户注册,登录。房屋的增删改查功能,以及给卖家留言的功能。