第一步:搭架子,把 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;
}
}
分享到:
相关推荐
在"Web单点登录 禁止多用户登录"的场景下,系统设计的目标是确保同一账号在同一时间只能有一个用户在线。这种机制通常用于防止未经授权的多用户同时使用一个账号,从而保护用户的隐私和数据安全。例如,如果一个账号...
如果此时有其他设备尝试用同一账号登录,系统会检查账号状态,发现账号已经在线,从而拒绝新的登录请求。在某些系统中,可能会选择注销当前在线的用户,强制下线已登录的设备。 Java作为广泛使用的后端开发语言,...
一个自己写的实现单用户登录,单点登录的监听器,一旦新用户登录将会销毁上一个登录用户的session 只需在设置session值之前调用一下重置登录这个方法 值得注意的就是,里面的判断得根据自己的项目中存的session的...
AD域-限制windows域用户多点并发登录是指在Active Directory域中限制用户多点并发登录,以防止用户账号被盗用和不安全登录。通过创建GPO和脚本,可以实现用户登录限制,提高域安全性。 描述解释 限制Windows域用户...
总的来说,"Steam快速登录程序 多账户登录"是一个旨在提高Steam用户账号管理效率的实用工具,通过自动化和便捷的操作,使多账户用户能够轻松应对各种场景。但同时,用户也需要关注程序的安全性和合法性,确保账户的...
这个过程可能导致登录速度变慢,特别是当用户被设置为受限账户时,因为系统需要执行更多的安全检查。随着时间的推移,再次登录时,由于配置文件已存在,速度通常会加快。这是一个正常的初始化过程,无需过多担忧。 ...
本次我们关注的话题是如何实现一个账号仅允许一个用户登录的功能,这通常涉及到会话管理、数据库交互以及用户验证等多个关键点。这个功能对于提高系统的安全性至关重要,避免了同一账号在多个设备或浏览器同时登录,...
在C#编程中,"同一个账号只能登录一次"的需求是一个常见的多用户系统设计规范,它旨在确保用户账户的安全性和系统的一致性。当一个账号在一处登录后,其他地方的同一账号尝试登录时,系统应该拒绝该请求或者强制结束...
"一个账号同一时间只能登录一次"的功能,通常被称为单点登录(Single Sign-On,简称SSO),它能够防止恶意用户同时在多个设备或浏览器会话中登录同一个账号,确保了用户的账户安全。下面将详细讲解如何实现这一功能...
用户单点登录(Single Sign-On,简称SSO)是一种网络身份验证机制,允许用户在一个系统或服务中登录后,无需再次认证即可访问多个相互信任的系统。这种技术大大提升了用户体验,减少了频繁输入用户名和密码的繁琐...
登录用于确定用户是否能够访问SQL Server实例,而用户(User)则用于定义登录后可以访问哪些数据库及其权限。 #### 二、禁用登录账号 禁用登录账号意味着阻止该登录账号连接到SQL Server实例。这通常用于安全考虑...
"SAP用户登录日志记录查看方法" 在SAP系统中,默认情况下只能查看用户的上次登录记录,但之前的登录并不会进行记录。这篇文章将介绍如何设置审计参数文件,并利用审计日志来查看用户在某段时间内的登录情况。 首先...
这种系统能够有效提升用户账户的安全性,同时也为开发者提供了实时反馈的可能,便于实现更复杂的交互逻辑。在实际应用中,还需要考虑与其他服务的集成,如身份验证服务、日志记录以及错误报告等。
首先,该解决方案的核心是一个单点登录管理应用,用户在这里注册一个全局账号,然后将这个账号与各个应用系统中的原有账号进行绑定。这个过程涉及到安全验证,由单点登录管理应用服务器通过Web Service接口与各个...
- 如果`Login_status`为1,即用户已登录,显示错误消息告知用户“该账户已在另一设备登录”。 - 如果`Login_status`为0,即用户未登录,允许登录,并更新`User_address`为当前IP地址,`Last_login_time`为当前时间...
“客户端.exe”是用户直接使用的登录程序,它包含了用户界面和登录逻辑,而“管理端.exe”可能是后台管理系统,用于管理员对用户账号的管理与维护。这两个执行文件的运行依赖于“bby.ec”和“精易模块.ec”等资源...
这主要是为了防止恶意用户通过多次登录尝试绕过系统的安全性,或者是为了保护用户的账户,避免他们意外地在多个窗口或浏览器标签页中保持活动状态,可能导致数据混乱或隐私泄露。以下是一些常见的防止用户重复登录的...
这两种方法分别为:通过修改用户账户属性中的登录选项来实现,以及利用脚本结合组策略的方式进行配置。 #### 方法一:通过用户账户属性实现限制 **基本思路:** 通过修改特定用户的账户属性中的“登录到”选项,...