- 浏览: 30245 次
- 性别:
- 来自: 杭州
文章分类
最新评论
首先使用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);
}
}
申明:次例子比较浅陋,只是个人学习笔录。
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);
}
}
申明:次例子比较浅陋,只是个人学习笔录。
发表评论
-
aaaaaaaaaaaa
2014-08-30 09:01 0111111111111111 -
struts2与checkbox的关系
2014-03-25 15:35 622Struts2 框架对checkbox的处理 1、 对于htm ... -
doc命令之关机管理
2014-03-21 09:26 686@echo off set /p p=是否关机(1:关机 2: ... -
金字塔最短路径
2014-03-18 10:02 575class Triangle { private int[] ... -
汉诺塔递归算法
2014-03-15 10:49 580class Hanio { private int st ... -
回溯算法之八皇后
2014-03-13 13:27 607public class EightQueens { ... -
xml的基本学习
2014-03-04 15:17 8771、 XML的概念 允许开发 ... -
软件生命三大测试的概念和区别
2014-02-17 22:01 0根据不同的测试阶段,测试可以分为单元测试、集成测试、系统测试和 ... -
线程概念
2013-03-20 21:06 0线程对可共享的、可改变的状态变量进行访问,需要实现协同,否则数 ... -
KMP算法
2013-03-20 14:10 918package zl.character.compare; ... -
parseInt惹的祸
2013-03-04 17:57 811今天项目在实施的过程中,出现了让我懊恼的事情: 卡的金额读不出 ... -
Unable to retrieve metadata for procedure
2013-03-01 13:51 3911第一次用jdbc调用mysql存储过程的过程中犯了一个严重的错 ... -
JDK动态代理和CGLIB动态代理的学习
2012-10-08 17:25 0JDK动态代理是基于java.lang.reflect.Pro ... -
log4j输出spring框架的信息
2012-10-08 17:00 0log4j.logger.org.springframewor ... -
ReadWriteLock多线程下操作
2012-09-06 17:45 999ReadWriteLock是实现多线程环境下同步的一种方式。与 ... -
WIN7 BCompare 启动应用程序发生错误
2012-08-24 11:26 1121WIN7下寻找: 把C:\用户\[用户名]\AppData\S ... -
ant
2012-08-24 11:15 0当使用-jar执行可执行Jar包时,JVM将Jar包所在目录设 ... -
spring框架后处理器的学习
2012-07-27 09:22 730spring框架对容器管理bean和容器本身提供了额外增强功能 ... -
socket简单通讯
2012-07-26 17:09 801package zl.socket.server; impo ... -
java命令执行class文件
2012-07-26 14:30 705eclipse编译出来的class文件如果带有包结构,请在命令 ...
相关推荐
- **设置SESSION**:在SpringMVC控制器中,可以使用`HttpSession`对象来创建和管理SESSION,例如`session.setAttribute("key", value);` - **读取SESSION**:在其他方法中,可以通过`session.getAttribute("key")`...
标题中的"php_users_admin_session.rar_admin session_php 用户管理"表明这是一个关于PHP编程中用户管理和会话(session)处理的资源包。这个压缩包包含了多个PHP脚本和一个数据库结构文档,用于实现一个多用户管理...
根据提供的文件信息,本文将详细解释如何在ASP.NET应用程序中实现关闭页面时清除Session状态的...通过监听页面卸载事件并在合适的时机调用Session清除方法,可以有效地管理Session生命周期,提高系统的性能和安全性。
Java Session监听器是Java Servlet规范中提供的一种机制,用于对HttpSession对象的生命周期事件进行监听和处理。在Web应用程序中,Session是用来跟踪用户状态的重要工具,特别是在无状态的HTTP协议上。当用户登录后...
3. **检测和处理异常**:在代码中加入错误处理逻辑,确保Session操作的正确性。 4. **优化Session管理**:合理设计Session存储结构,避免过多的Session占用服务器资源。 5. **提示用户**:当检测到Session失效时,...
这可能意味着解决方案包含了对`Session`有效期的管理,以及对用户登录次数的记录。对于`Session`有效期,开发者可以自定义设置,例如在用户登录时延长其`Session`的生命周期,以保持用户在线状态。而“times”可能是...
标题中的“多开session”指的是在开发过程中同时开启多个浏览器会话的能力,这对于需要测试不同用户账户、模拟并发用户或进行多任务处理的开发者来说非常有用。这种技术可以帮助开发者更高效地工作,避免了在不同...
JavaWeb银行账户管理系统是一款基于Java技术的Web应用,旨在帮助初学者理解并实践Web应用程序的开发,特别是针对金融系统的简单管理功能。这个项目的核心目标是模拟真实银行账户的基本操作,如开户、存款、取款、...
可能包括示例代码、配置文件、日志文件等,帮助开发者理解和实践Session管理,尤其是涉及到多个Session的安全问题,如会话劫持、会话固定等。 总结来说,"Session Timeout需求解决"涵盖了Web应用状态管理、用户交互...
`demo.js`可能是整个应用程序的核心脚本,它包含了处理用户登录、验证、Session管理和会话过期逻辑。通过分析这个文件,我们可以更深入地理解如何在实际项目中实施这些功能。 总的来说,JavaScript在密码保护和...
- **数据管理:**服务器端可以将用户的特定信息存储在Session变量中,例如用户的登录状态、购物车中的商品等。 #### 二、Session在PHP中的实现 在PHP中,Session的实现相对简单且高效,下面我们将详细介绍如何在...
- 用户登录模块:处理用户登录请求,验证凭证,创建Session并存储用户信息。 - 会话检查拦截器:在用户访问受保护资源之前检查Session状态,如果Session不存在或者已过期,则重定向到登录页面。 - 重复登录控制:...
账户管理模块,包括开户、存款、取款、转账等功能,需要处理并发访问和事务管理,确保数据一致性;客户信息管理模块,用于存储和查询客户的基本信息;权限控制模块,根据角色划分不同用户的操作权限,防止非法访问;...
这个项目可以帮助我们理解如何在实际应用中结合JSP、cookie和session来实现用户验证和数据管理。 总结来说,JSP结合cookie和session提供了强大的用户认证和会话管理功能。通过CRUD操作,我们可以轻松地对用户数据...
"Session实现登录工程"就是这样一个主题,它涉及到如何利用session技术来处理用户的登录状态,确保用户的安全性和操作的合法性。接下来,我们将深入探讨session的工作原理、在登录工程中的应用以及与数据库交互的增...
在描述的场景中,一个servlet需要处理从一个账户向另一个账户转账的请求。如果没有Session Facade,servlet会直接调用多个EJB(包括Session Bean和Entity Bean),这会导致一系列的网络调用,每个操作都在单独的事务...
此外,还可以考虑在用户登录后将购物车数据与用户账户关联,这样即使Session失效,用户登录后仍能找回购物车信息。 在三层架构中,通常包含表现层(UI)、业务逻辑层(BLL)和数据访问层(DAL)。在这个案例中: -...
在Oracle数据库管理与维护过程中,“Oracle Kill Session”是一项非常重要的操作技巧。本文将从理论到实践多个层面深入探讨如何有效地执行“Oracle Kill Session”,帮助数据库管理员更好地理解和掌握这一技能。 ##...
- **Session管理**:定期清理过期Session,防止Session劫持。 - **令牌安全**:对访问令牌进行加密,且要限制令牌的有效期,过期后重新获取。 - **第三方登录风险**:注意第三方平台的接口变更和安全策略,确保用户...