`
zjxs_sky100
  • 浏览: 30245 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Session处理同账号管理

 
阅读更多
首先使用HttpSessionAttributeListener监听session的属性添加
HttpSessionListener监听session的创建和销毁
session的invalidate方法 会删除属性同时触发attributeRemoved方法
监听器代码如下:
public class BindingListener implements HttpSessionListener,
HttpSessionAttributeListener {

private static List<LineUser> login_users = null;
private final int LIMIT_NUMS = 100;


static {
if (login_users == null) {
login_users = new ArrayList<LineUser>();
}

login_users = Collections.synchronizedList(login_users);
}

public void sessionCreated(HttpSessionEvent arg0) {
System.out.println(arg0.getSession().getId()
   + "session 创建时间:" + new Date());
}

public void sessionDestroyed(HttpSessionEvent arg0) {
System.out.println(arg0.getSession().getId()
   + "session 销毁时间:" + new Date());

}

public void attributeAdded(HttpSessionBindingEvent arg0) {
System.out.println("属性发生添加......");
String attr_name = arg0.getName();
String attr_value = (String)arg0.getValue();
int size = login_users.size();
LineUser user = null;
boolean flag = true;
String content = null;

if (Constant.USER_NAME.equals(attr_name)) {

for (int i = 0; i < size; i++) {
user = login_users.get(i);

if (user.getUserName().equals(attr_value)) {

// login_users.remove(user);
// user.getSession().invalidate();
// System.out.println(user.getSessionId() + " 失效......");

content = Constant.LOGIN_HAVE;
flag = false;

}
}

if (flag) {

if ((size + 1) < LIMIT_NUMS ) {

user = new LineUser();
user.setSession(arg0.getSession());
user.setSessionId(user.getSession().getId());
user.setUserName(attr_value);
login_users.add(user);
content = Constant.LOGIN_OK;
} else
content = Constant.LOGIN_LIMIT;
}

arg0.getSession().setAttribute(Constant.LOGIN_FLAG, content);

}

}

public void attributeRemoved(HttpSessionBindingEvent arg0) {
System.out.println("属性发生删除......");
String attr_name = arg0.getName();
String attr_value = (String)arg0.getValue();
int size = login_users.size();
LineUser user = null;

if (Constant.USER_NAME.equals(attr_name)) {

for (int i = 0; i < size; i++) {

user = login_users.get(i);
if (user.getUserName().equals(attr_value)) {

login_users.remove(user);
}

}
}

}

public void attributeReplaced(HttpSessionBindingEvent arg0) {
System.out.println("属性发生替换......");
String attr_name = arg0.getName();
String attr_value = (String)arg0.getValue();
int size = login_users.size();
LineUser user = null;

if (Constant.USER_NAME.equals(attr_name)) {

for (int i = 0; i < size; i++) {

user = login_users.get(i);

if (user.getUserName().equals(attr_value)
&& !user.getSessionId().equals(arg0.getSession().getId())) {

user.getSession().invalidate();
System.out.println(user.getSessionId() + " 已经失效......");

} else if (user.getSessionId().equals(arg0.getSession().getId())) {

user.setUserName(attr_value);
}

}
}

}

}

servlet实现如下:
public class LoginServlet extends HttpServlet {

protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
this.doPost(req, resp);
}

protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {

String name = req.getParameter("name");
String password = req.getParameter("password");

System.out.println("现在登录用户:" + name);

HttpSession session = req.getSession(true);
session.setAttribute(Constant.USER_NAME, name);

String content = (String)session.getAttribute(Constant.LOGIN_FLAG);
if (Constant.LOGIN_LIMIT.equals(content))
System.out.println("登录人数已经受限制");
else if (Constant.LOGIN_HAVE.equals(content))
System.out.println("账号已经登录");
else if (Constant.LOGIN_OK.equals(content))
System.out.println("登录成功");

req.getRequestDispatcher("/index.jsp").forward(req,resp);
}


}

申明:次例子比较浅陋,只是个人学习笔录。
分享到:
评论

相关推荐

    微信小程序用户登录、注册、SESSION同步、交互等

    - **设置SESSION**:在SpringMVC控制器中,可以使用`HttpSession`对象来创建和管理SESSION,例如`session.setAttribute("key", value);` - **读取SESSION**:在其他方法中,可以通过`session.getAttribute("key")`...

    php_users_admin_session.rar_admin session_php 用户管理

    标题中的"php_users_admin_session.rar_admin session_php 用户管理"表明这是一个关于PHP编程中用户管理和会话(session)处理的资源包。这个压缩包包含了多个PHP脚本和一个数据库结构文档,用于实现一个多用户管理...

    关闭页面时清空Session (ASP.net ) (已实现)

    根据提供的文件信息,本文将详细解释如何在ASP.NET应用程序中实现关闭页面时清除Session状态的...通过监听页面卸载事件并在合适的时机调用Session清除方法,可以有效地管理Session生命周期,提高系统的性能和安全性。

    JAVA SESSION监听器

    Java Session监听器是Java Servlet规范中提供的一种机制,用于对HttpSession对象的生命周期事件进行监听和处理。在Web应用程序中,Session是用来跟踪用户状态的重要工具,特别是在无状态的HTTP协议上。当用户登录后...

    session 失效

    3. **检测和处理异常**:在代码中加入错误处理逻辑,确保Session操作的正确性。 4. **优化Session管理**:合理设计Session存储结构,避免过多的Session占用服务器资源。 5. **提示用户**:当检测到Session失效时,...

    .net C# 利用session控制用户重复登录及统计在线用户数解决方案

    这可能意味着解决方案包含了对`Session`有效期的管理,以及对用户登录次数的记录。对于`Session`有效期,开发者可以自定义设置,例如在用户登录时延长其`Session`的生命周期,以保持用户在线状态。而“times”可能是...

    多开session,开发必备,可一次性打开多个网页登录多个用户,免去来回切换账号的烦恼

    标题中的“多开session”指的是在开发过程中同时开启多个浏览器会话的能力,这对于需要测试不同用户账户、模拟并发用户或进行多任务处理的开发者来说非常有用。这种技术可以帮助开发者更高效地工作,避免了在不同...

    javaWeb银行账户管理系统源码

    JavaWeb银行账户管理系统是一款基于Java技术的Web应用,旨在帮助初学者理解并实践Web应用程序的开发,特别是针对金融系统的简单管理功能。这个项目的核心目标是模拟真实银行账户的基本操作,如开户、存款、取款、...

    Session Timeout需求解決

    可能包括示例代码、配置文件、日志文件等,帮助开发者理解和实践Session管理,尤其是涉及到多个Session的安全问题,如会话劫持、会话固定等。 总结来说,"Session Timeout需求解决"涵盖了Web应用状态管理、用户交互...

    Javascript 密码保护和Session 管理

    `demo.js`可能是整个应用程序的核心脚本,它包含了处理用户登录、验证、Session管理和会话过期逻辑。通过分析这个文件,我们可以更深入地理解如何在实际项目中实施这些功能。 总的来说,JavaScript在密码保护和...

    PHP中session全面教程

    - **数据管理:**服务器端可以将用户的特定信息存储在Session变量中,例如用户的登录状态、购物车中的商品等。 #### 二、Session在PHP中的实现 在PHP中,Session的实现相对简单且高效,下面我们将详细介绍如何在...

    struts2_session_权限检查并控制重复登录源码

    - 用户登录模块:处理用户登录请求,验证凭证,创建Session并存储用户信息。 - 会话检查拦截器:在用户访问受保护资源之前检查Session状态,如果Session不存在或者已过期,则重定向到登录页面。 - 重复登录控制:...

    银行账户管理系统

    账户管理模块,包括开户、存款、取款、转账等功能,需要处理并发访问和事务管理,确保数据一致性;客户信息管理模块,用于存储和查询客户的基本信息;权限控制模块,根据角色划分不同用户的操作权限,防止非法访问;...

    jsp-cookie-session-crud 使用 JSP 实现cookie session验证及增删改查

    这个项目可以帮助我们理解如何在实际应用中结合JSP、cookie和session来实现用户验证和数据管理。 总结来说,JSP结合cookie和session提供了强大的用户认证和会话管理功能。通过CRUD操作,我们可以轻松地对用户数据...

    session实现登录工程

    "Session实现登录工程"就是这样一个主题,它涉及到如何利用session技术来处理用户的登录状态,确保用户的安全性和操作的合法性。接下来,我们将深入探讨session的工作原理、在登录工程中的应用以及与数据库交互的增...

    session facade:基于在线式银行的应用

    在描述的场景中,一个servlet需要处理从一个账户向另一个账户转账的请求。如果没有Session Facade,servlet会直接调用多个EJB(包括Session Bean和Entity Bean),这会导致一系列的网络调用,每个操作都在单独的事务...

    asp.net做的购物车session

    此外,还可以考虑在用户登录后将购物车数据与用户账户关联,这样即使Session失效,用户登录后仍能找回购物车信息。 在三层架构中,通常包含表现层(UI)、业务逻辑层(BLL)和数据访问层(DAL)。在这个案例中: -...

    oracle kill session

    在Oracle数据库管理与维护过程中,“Oracle Kill Session”是一项非常重要的操作技巧。本文将从理论到实践多个层面深入探讨如何有效地执行“Oracle Kill Session”,帮助数据库管理员更好地理解和掌握这一技能。 ##...

    cookie+session实现的单点登录案例

    - **Session管理**:定期清理过期Session,防止Session劫持。 - **令牌安全**:对访问令牌进行加密,且要限制令牌的有效期,过期后重新获取。 - **第三方登录风险**:注意第三方平台的接口变更和安全策略,确保用户...

Global site tag (gtag.js) - Google Analytics