`
topcss
  • 浏览: 101571 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
文章分类
社区版块
存档分类
最新评论

基于SSH的单用户单账户登录全过程。

阅读更多

 

[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 找到我。

分享到:
评论
6 楼 liufangmeng 2009-07-20  
就是session里的id判断和地址对比
5 楼 topcss 2009-07-19  
引用

zouguibao 发送至 我
显示详细信息 7月16日 (3 天前) 回复

您好:topcss
在javaeye论坛里您发表主题为“基于SSH的单用户单帐户登录全过程”的帖子,我仔细看了,有些细节不是很明白,向你请教一下。过滤器中的String fn = request.getParameter("fn");中的fn参数从哪里获取来的,有什么作用?还有您的action中的result.getUserStates().getId() == 1中的getUserStates().getId()是什么呢?字段吗?有什么作用?如果可能的话,可以把整个项目发给我吗?
  期待您的回复。


前两天网络出问题了,刚才才上起网。

1.String fn = request.getParameter("fn");中的fn参数从哪里获取来的?
答:
是在struts-config.xml文件中配置的,他用来得到方法名,如:

我们的jsp页面中有这么一个form,
<form action="user.do" method="post">
    <input type="hidden" name="fn" value="login" />
</form>
其功能为用户登录[value="login"],而用户类中有多个方法。[注册,退出等...]


2.action中的result.getUserStates().getId() == 1中的getUserStates().getId()是什么呢?
答:
这里,由于用户登录时需要判断用户的状态是否正常,故,写了“result.getUserStates().getId() == 1”句代码



至于项目,只是没事时随便写了一个例子而已,当时没有保存下来,确实不好意思...
4 楼 topcss 2009-07-14  
yisafe 写道
貌似太简单的介绍了!如果做出一个基于SSH的例子,着重描述架构的原理和spring的事务配置。



第一步:搭架子,把 SSH 整合起来。参照:

[url]http://sites.google.com/site/topcss/struts-spring-hibernate-de-ji-cheng [/url]


这里有Spring的配置
3 楼 yisafe 2009-07-14  
貌似太简单的介绍了!如果做出一个基于SSH的例子,着重描述架构的原理和spring的事务配置。
2 楼 myworkfirst 2009-07-13  
KimShen 写道
不需要基于SSH,基于Servlet足以

   jsp也行,呵呵。
1 楼 KimShen 2009-07-13  
不需要基于SSH,基于Servlet足以

相关推荐

    基于ssh的个人银行账户管理系统的设计与实现,一整套,工程,数据库文件,word,ppt,直接运行

    这个"基于SSH的个人银行账户管理系统"是一个完整的项目实例,它涵盖了从设计到实现的全过程,包括数据库设计、前端界面、后端业务逻辑以及与用户的交互功能。以下是对该项目中涉及的主要知识点的详细解释: 1. SSH...

    基于SSH银行管理系统.zip

    本系统——"基于SSH银行管理系统",是一个完整的银行业务流程模拟平台,旨在提供全方位的银行业务服务,如账户管理、存款取款、转账等。下面我们将深入探讨SSH框架的核心概念以及在银行管理系统中的应用。 首先,...

    SSH做的博客系统

    这些视频可能涵盖了从安装环境到配置SSH框架,再到开发和部署博客系统的全过程。 6. **学习价值**:这样的博客系统对于初学者来说,是一个很好的实践项目,可以深入理解SSH框架的集成和工作原理,提升Web开发技能。...

    3.7javaEE_SSH_MySqL基于SSH的医院在线挂号.zip

    总之,"3.7javaEE_SSH_MySql基于SSH的医院在线挂号"项目是一个全面的Web开发实践,涵盖了从用户界面到数据库设计的全过程,对于提升开发者在JavaEE领域的技能具有重要意义。通过学习和实践,开发者不仅能掌握SSH框架...

    408JSP基于SSH2在线音乐检索网站毕业课程源码设计+论文资料

    前台用户可以注册账户,通过登录后可以享受在线音乐播放服务,搜索功能允许用户根据歌曲名和歌手信息检索音乐资源。用户还可以在网站上留言,与站长或其他用户进行互动。后台管理员则拥有更高的权限,可以进行音乐...

    郑州轻工业学院实训报告基于SSH框架的运动社区系统的实现.doc

    本实训报告主要探讨了基于SSH(Struts、Spring、Hibernate)框架的运动社区系统的实现,这是在郑州轻工业学院软件学院进行的一项实践活动。报告详细介绍了系统从需求分析到功能实现的全过程,旨在提升学生的Java技术...

    JSP基于SSH的记账管理系统(MySQL版).zip

    作为计算机毕业设计项目,这个系统体现了学生对Java Web开发的理解和实践能力,涵盖了从前端界面设计到后端服务实现的全过程。同时,它还可能包括系统需求分析、数据库设计、性能优化等方面的考虑,是一次综合性的...

    ssh+maven+bootstrap权限管理+登录注册等完整项目,完整代码

    该项目是一个综合性的Web应用,基于SSH(Spring、Struts2、Hibernate)框架,结合Maven构建工具和Bootstrap前端框架,实现了完整的权限管理和用户登录注册功能。以下是对该项目中涉及的关键技术点的详细解释: 1. *...

    bank.zip_bank ssh_java_ssh_ssh银行_银行管理系统

    【标题】"bank.zip_bank ssh_java_ssh_ssh银行_银行管理系统" 指的是一款基于SSH框架开发的银行账目管理系统,该系统集成了多种功能,适用于处理银行日常业务操作。SSH是一个流行的企业级Web应用程序开发框架,由...

    毕业论文jsp405网上购物系统(ssh).doc

    总结来说,这篇毕业论文详细记录了使用JSP和SSH框架开发网上购物系统的全过程,不仅展现了作者对相关技术的掌握,也展示了软件工程方法论在实际项目中的应用。通过这个系统,我们可以看到电子商务解决方案是如何结合...

    于SSH2框架技术的网上购餐平台的设计与实现毕业论文.doc

    《基于SSH2框架技术的网上购餐平台设计与实现》 该毕业论文的主题聚焦于使用SSH2(Struts2 + Hibernate + Spring)框架构建一个网上购餐平台。SSH2是Java Web开发中的一种流行框架组合,它为开发高效、可维护的Web...

    SSH框架答辩PPT学习教案.pptx

    这个答辩PPT的学习教案详细介绍了SSH框架在开发客户关系管理系统中的应用,涵盖了从开发环境的选择、框架原理到实际项目实施的全过程,对于学习和理解SSH框架及其在实际项目中的运用具有很高的参考价值。同时,它也...

    毕业论文jsp2102家庭收支管理系统ssh.doc

    5. **权限控制**:为了保护用户隐私,系统应具备用户登录和权限验证机制,每个用户只能查看和管理自己的收支记录。 6. **数据备份与恢复**:为防止数据丢失,系统需支持定期备份数据,并提供数据恢复功能。 在系统...

    毕业论文jsp1126移动端的有偿视频网站ssh html.docx

    * 用户管理:能够管理用户的账户信息和视频观看记录。 六、业务流程分析 基于移动端的有偿视频网站的业务流程包括以下几个步骤: * 用户注册:用户注册账户后,能够登录网站。 * 视频上传:用户可以上传视频到...

    基于HTML5的O2O超市系统的设计与实现.doc

    系统架构基于Java的SSH2框架,即Spring、Struts2和Hibernate的组合,采用MVC(Model-View-Controller)模式,实现了业务逻辑、数据处理和用户界面的分离。在前端,使用JavaScript、HTML和CSS构建动态交互的页面,...

    水果销售商城系统+论文+源码 jsp ssh mvc java web j2ee毕业设计

    《水果销售商城系统+论文+源码:基于jsp ssh mvc的java web j2ee实践》 本项目是一个完整的水果销售商城系统,旨在为毕业生提供一个深入理解和实践Java Web开发的平台。它采用SSH(Spring、Struts、Hibernate)框架...

    毕业论文jsp1475保健品销售购物网站ssh.doc

    毕业论文《保健品销售购物网站ssh.doc...该论文详细阐述了从项目构思到实现的全过程,涵盖了需求分析、系统设计、技术选型、数据库设计、测试等多个关键步骤,对于理解SSH技术在电子商务领域的应用具有一定的参考价值。

    毕业论文jsp1533汽车销售管理系统ssh.doc

    综上所述,本文档详细介绍了基于JSP和SSH框架的昆山保时捷汽车销售管理系统的开发过程,涵盖了从需求分析到系统测试的全过程,展示了如何利用现代信息技术提升汽车销售领域的业务效率和服务质量。

    Shop,crm,bbs,ssh整合源码

    SSH框架可以提供强大的数据访问和页面展示能力,同时Spring的安全特性可以保障用户账户的安全。 4. **SSH整合**:Spring、Struts和Hibernate是Java开发中常见的三大开源框架。它们的整合可以简化开发过程,提高代码...

    毕业论文jsp952饭卡管理系统ssh.doc

    毕业论文《jsp952饭卡管理系统ssh》深入探讨了基于Java Web技术的饭卡管理系统的设计与实现。本文档详细阐述了系统开发的全过程,涵盖了从项目背景、现状分析到功能设计、数据库构建等多个关键环节。 1. 研究背景:...

Global site tag (gtag.js) - Google Analytics