public class OnlineCounterListener implements HttpSessionBindingListener {
private OnlineUser newUser=null; //OnlineUser是用户类
/**
* Constructor for OnlineCounterListener.
*/
public OnlineCounterListener() {
newUser = new OnlineUser();
} @Override
public void valueBound(HttpSessionBindingEvent e) {
User user = (User)e.getSession().getAttribute("userInfo");
newUser.setUser(user);
try {
if(isInList(user))
newUser.updateOnline();
}
catch (Exception ex) {
}
//System.out.println("用户"+e.getSession().getAttribute("ScmLogin")+"上限"); }
@Override
public void valueUnbound(HttpSessionBindingEvent e) {
//User user = (User)e.getSession().getAttribute("userInfo");
// newUser.setUser(user);
try {
newUser.updateUnline();
}
catch (Exception ex) {
} }
public boolean isInList(User user){
List list = OnlineUser.getList();
if(list.size()>0){
for(int i=0;i<list.size();i++){
User myLogin = (User)list.get(i);
if(user.getId()==myLogin.getId())
return false;
}
}
return true;
} 这个方法可以实现在线用户,但是现在需要同一账户只能登录后一次登录的把前一次登录的顶掉,类似QQ。这个需要用到sessionId ,但是我现在这样写的不知道该怎么用sessionId ?
哪个高手出来帮帮忙。
private OnlineUser newUser=null; //OnlineUser是用户类
/**
* Constructor for OnlineCounterListener.
*/
public OnlineCounterListener() {
newUser = new OnlineUser();
} @Override
public void valueBound(HttpSessionBindingEvent e) {
User user = (User)e.getSession().getAttribute("userInfo");
newUser.setUser(user);
try {
if(isInList(user))
newUser.updateOnline();
}
catch (Exception ex) {
}
//System.out.println("用户"+e.getSession().getAttribute("ScmLogin")+"上限"); }
@Override
public void valueUnbound(HttpSessionBindingEvent e) {
//User user = (User)e.getSession().getAttribute("userInfo");
// newUser.setUser(user);
try {
newUser.updateUnline();
}
catch (Exception ex) {
} }
public boolean isInList(User user){
List list = OnlineUser.getList();
if(list.size()>0){
for(int i=0;i<list.size();i++){
User myLogin = (User)list.get(i);
if(user.getId()==myLogin.getId())
return false;
}
}
return true;
} 这个方法可以实现在线用户,但是现在需要同一账户只能登录后一次登录的把前一次登录的顶掉,类似QQ。这个需要用到sessionId ,但是我现在这样写的不知道该怎么用sessionId ?
哪个高手出来帮帮忙。
但如果集群情况的话,那么问题会复杂很多。
Map<String,String> sessionIdMap = (Map<String,String>)applicationContext.getAttribute("sessionIdMap ");
if(sessionIdMap == null){
sessionIdMap = new HashMap<String,String>();
}
sessionIdMap.put(user.getUserName,request.getSession().getSessionId());
增加一个filter,逻辑如下:
Map<String,String> sessionIdMap = (Map<String,String>)applicationContext.getAttribute("sessionIdMap ");
if(sessionIdMap != null && sessionIdMap.get(user.getUserName()) != null || !request.getSession().getSessionId().equals(sessionIdMap.get(user.getUserName()))){
//此种情况重复登陆,forward到登陆页面
}else{
//此种情况正常,只有一处地方登陆dofilter(......);
}
然后B来登录了,发现与A是同一个人(即在map里面有他的标识存在了),就修改下这个用户标识(比如map对应的ip)
那当A操作时发现自己map里面的标识变了,然后就自动下线。把标识放进数据库也一样的道理吧。不过这样做有一问题就是,因为你只是更改了A的数据,如果A不操作,那他显示的还是在线,必须有触发才能检查到数据的变化,从而做出反应。