不用Lock,改用ConcurrentHashMap试试。不过,架构一开始就有问题,在这里一时半会也说不清楚。建议你先看看acegisecurity的HttpSessionIntegrationFilter的原代码,或来参加我们的面对面的技术交流活动。http://www.tianji.com/Event/DetailEvent?eventId=486896&groupId=
解决方案 »
- 这个怎么回事? 数据库都插入了
- 不显示删除回复显示所有回复显示星级回复显示得分回复 struts2 验证码报错 org.apache.catalina.core.StandardWrappe
- httpclient上传文件问题(求救)
- 怎样判断一个TreeSet增加了??
- 急,oracle转sql server
- javamail中处理gmail附件
- 使用<html:select>标签遇到困难了SOS
- 数据库db2,怎样对clob字段进行写入和读取操作,十万火急!!!
- 请教 JonAS 远程访问的问题
- jbuilder7使用问题? 为什么我程序选择光标和实际文字是错开的?是盗版的问题吗?怎么改过来
- 紧急求教hibernate查询问题!!!当天结贴
- 一个转化类型问题.
//再添加新的用户
sessionId_user.put(sessionId,user);
loginName_sessionId.put(user.getLoginname(),sessionId);2.另外,读锁可以不要的.
readLock.lock();
readLock.unlock();
j2ee里为什么要设计有这两种作用域?public class OnlineUser implements HttpSessionListener { private static final Map<String, String> onlineUsers = Collections.synchronizedMap(new HashMap<String, String>()); /**
* 返回当前登陆用户数
*/
public static int size() {
return onlineUsers.size();
} /**
* 根据会话ID获得当前用户对象
*/
public static String getUserName(String sessionId) {
return onlineUsers.get(sessionId);
}
/**
* 新增登陆用户
*/
public static void addUser(String sessionId, User user) {
onlineUsers.put(sessionId, user.getUsername());
} /**
* 根据会话ID检查该用户是否登陆
*/
public static boolean containsUserByLoginName(String loginName) {
return onlineUsers.containsValue(loginName);
} /**
* 根据会话ID检查该用户是否登陆
*/
public static boolean containsUserBySessionID(String sessionId) {
return onlineUsers.containsKey(sessionId);
} /**
* 根据会话ID删除用户
*/
public static void removeUserBySessionId(String sessionId) {
onlineUsers.remove(sessionId);
}
/**
* 会话创建
*/
public void sessionCreated(HttpSessionEvent se) { } /**
* 会话结束
*/
public void sessionDestroyed(HttpSessionEvent se) {
onlineUsers.remove(se.getSession().getId());
} /**
* 返回登陆用户Iterator
*/
public static Iterator userIterator() {
return onlineUsers.values().iterator();
}
}
这样就有一个问题,如果踢用户的问题,因为我们的项目是需要踢掉上次该用户的登陆的。
之所以放用户用户对象到MAP,也是便于处理的考虑.如果改用dreamover(梦醒了〖http://hellfire.cn〗)的代码,那就比较麻烦了.如果没有这样的需求,倒是可以使用dreamover(梦醒了〖http://hellfire.cn〗)的方法.还是期待大家的讨论,因为问题还是没有解决哦.
addUser(HttpSession session,TUser user),等同于用一个线程访问另一个线程的资源,你可能需要先分析web容器对session变量的保护机制,如果采用threadlocal进行保护的~~,你的问题应该很容易解释。
同步可以用Synchronous定义同步变量,同步函数,不需要再添加锁对象