在linux下通过wls1033_generic.jar包安装了weblogic 10.3.3,一个简单的通过HttpSessionBindingListener实现踢人功能,以下是部分代码,
public class UserTracker
implements HttpSessionBindingListener, Serializable {
private static UserTracker instance = null;// userID列表
public List trackerList = new ArrayList(); private UserTracker() {
super();
} public static UserTracker getInstance() {
if (instance == null) {
instance = new UserTracker();
}
return instance;
} /**
* 登录的时候记录
* @param event HttpSessionBindingEvent
*/
public void valueBound(HttpSessionBindingEvent event) {
UserTrackerInfo newTracker = new UserTrackerInfo();
newTracker.setUserCode((Integer)event.getSession().getAttribute("USERCODE"));
newTracker.setSessionID(event.getSession().getId());
//如果前面已经有登陆,则删除登陆的信息(踢人)
//removeUserIfExist(newTracker.getUserCode());
//增加自己
operateTracker(newTracker, "add");
} /**
* 超时的时候退出
* @param event HttpSessionBindingEvent
*/
public void valueUnbound(HttpSessionBindingEvent event) {
UserTrackerInfo oldTracker;
String sessionID = event.getSession().getId();
Iterator it = trackerList.iterator();
while (it.hasNext()) {
oldTracker = (UserTrackerInfo) it.next();
if (oldTracker.getSessionID().equals(sessionID)) {
operateTracker(oldTracker, "remove");
return;
}
}
} /**
*添加删除用户登录信息,operateType值"add","remove"
* @param event HttpSessionBindingEvent
*/
public void operateTracker(UserTrackerInfo tracker, String operaterType) {
if (operaterType.equals("add")) {
trackerList.add(tracker);
}
if (operaterType.equals("remove")) {
trackerList.remove(tracker);
} } /**
* 判断用户是否在登录页表中,如果不在,返回false
* @param sessionID String
* @return boolean
*/
public boolean existInLoginList(String sessionID) {
UserTrackerInfo oldTracker; Iterator it = trackerList.iterator();
while (it.hasNext()) {
oldTracker = (UserTrackerInfo) it.next();
System.out.println("新sessionid=================== "+sessionID);
System.out.println("旧sessionid=================== "+oldTracker.getSessionID());
if (oldTracker.getSessionID().equals(sessionID)) {
return true;
}
}
return false;
}
}
sessionTimeout过滤器中判断session是否在存在缓寸列表中,
boolean isSessionValid = UserTracker.existInLoginList(req.getRequestedSessionId()); 在linux weblogic 10.3.3下,发现isSessionValid始终为false,通过打印sessionid发现缓存trackerList内存放的sessionid与req.getRequestedSessionId()并不相同(同一个session),即HttpSessionBindingEvent.getSession().getId())与req.getRequestedSessionId()不同,但在windows weblogic10.3.3下,又可以,百思不得其解
public class UserTracker
implements HttpSessionBindingListener, Serializable {
private static UserTracker instance = null;// userID列表
public List trackerList = new ArrayList(); private UserTracker() {
super();
} public static UserTracker getInstance() {
if (instance == null) {
instance = new UserTracker();
}
return instance;
} /**
* 登录的时候记录
* @param event HttpSessionBindingEvent
*/
public void valueBound(HttpSessionBindingEvent event) {
UserTrackerInfo newTracker = new UserTrackerInfo();
newTracker.setUserCode((Integer)event.getSession().getAttribute("USERCODE"));
newTracker.setSessionID(event.getSession().getId());
//如果前面已经有登陆,则删除登陆的信息(踢人)
//removeUserIfExist(newTracker.getUserCode());
//增加自己
operateTracker(newTracker, "add");
} /**
* 超时的时候退出
* @param event HttpSessionBindingEvent
*/
public void valueUnbound(HttpSessionBindingEvent event) {
UserTrackerInfo oldTracker;
String sessionID = event.getSession().getId();
Iterator it = trackerList.iterator();
while (it.hasNext()) {
oldTracker = (UserTrackerInfo) it.next();
if (oldTracker.getSessionID().equals(sessionID)) {
operateTracker(oldTracker, "remove");
return;
}
}
} /**
*添加删除用户登录信息,operateType值"add","remove"
* @param event HttpSessionBindingEvent
*/
public void operateTracker(UserTrackerInfo tracker, String operaterType) {
if (operaterType.equals("add")) {
trackerList.add(tracker);
}
if (operaterType.equals("remove")) {
trackerList.remove(tracker);
} } /**
* 判断用户是否在登录页表中,如果不在,返回false
* @param sessionID String
* @return boolean
*/
public boolean existInLoginList(String sessionID) {
UserTrackerInfo oldTracker; Iterator it = trackerList.iterator();
while (it.hasNext()) {
oldTracker = (UserTrackerInfo) it.next();
System.out.println("新sessionid=================== "+sessionID);
System.out.println("旧sessionid=================== "+oldTracker.getSessionID());
if (oldTracker.getSessionID().equals(sessionID)) {
return true;
}
}
return false;
}
}
sessionTimeout过滤器中判断session是否在存在缓寸列表中,
boolean isSessionValid = UserTracker.existInLoginList(req.getRequestedSessionId()); 在linux weblogic 10.3.3下,发现isSessionValid始终为false,通过打印sessionid发现缓存trackerList内存放的sessionid与req.getRequestedSessionId()并不相同(同一个session),即HttpSessionBindingEvent.getSession().getId())与req.getRequestedSessionId()不同,但在windows weblogic10.3.3下,又可以,百思不得其解
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货