📄 onlineusermanager.java
字号:
for (int i = 0; i < cookies.length; i++) {
Cookie cookie = cookies[i];
String cookieName = cookie.getName();
if (cookieName.equals(MVNFORUM_COOKIE_USERNAME)) {
memberName = Encoder.decodeURL(cookie.getValue()) ;
} else if (cookieName.equals(MVNFORUM_COOKIE_PASSWORD)) {
encodedPassword = cookie.getValue();
}
}
}
if ( (memberName.length() > 0) && (encodedPassword.length() > 0) &&
(encodedPassword.equalsIgnoreCase(PASSWORD_OF_METHOD_REALM) == false) &&
(encodedPassword.equalsIgnoreCase(PASSWORD_OF_METHOD_CUSTOMIZATION) == false) ) {
try {
user = login(request, null, memberName, encodedPassword, true);
((OnlineUserImpl)user).setAuthenticationType(OnlineUser.AUTHENTICATION_TYPE_COOKIE);
} catch (AuthenticationException e) {
// do nothing, some time the login info in the cookie
// is not correct, we dont consider this case as error
}
}
}
if ((user == null) && enableLoginInfoInRealm && (null != request.getRemoteUser())) {
String memberName = StringUtil.getEmptyStringIfNull(request.getRemoteUser());
if ( memberName.length() > 0 ) {
try {
DAOFactory.getMemberDAO().findByAlternateKey_MemberName(memberName);
user = login(request, null, memberName, PASSWORD_OF_METHOD_REALM, true);
((OnlineUserImpl)user).setAuthenticationType(OnlineUser.AUTHENTICATION_TYPE_REALM);
} catch (ObjectNotFoundException oe) {
// ignore
}
}
}
if ((user == null) && enableLoginInfoInCustomization) {
if (authenticator == null) {
authenticator = ManagerFactory.getAuthenticator();
}
if (authenticator != null) {
String memberName = StringUtil.getEmptyStringIfNull(authenticator.getRemoteUser(request));
if (memberName.length() > 0) {
try {
DAOFactory.getMemberDAO().findByAlternateKey_MemberName(memberName);
user = login(request, null, memberName, PASSWORD_OF_METHOD_CUSTOMIZATION, true);
((OnlineUserImpl)user).setAuthenticationType(OnlineUser.AUTHENTICATION_TYPE_CUSTOMIZATION);
} catch (ObjectNotFoundException oe) {
// ignore
}
}
}
}
if (user == null) {
user = ManagerFactory.getOnlineUserFactory().getAnonymousUser(request);
setOnlineUser(sessionID, user);
}
} else { //user != null
// now we have the user, check if it is a Guest and we can login in REALM
boolean enableLoginInfoInRealm = MVNForumConfig.getEnableLoginInfoInRealm();
if (user.isGuest() && enableLoginInfoInRealm && (null != request.getRemoteUser())) {
String memberName = StringUtil.getEmptyStringIfNull(request.getRemoteUser());
if ( memberName.length() > 0 ) {
try {
DAOFactory.getMemberDAO().findByAlternateKey_MemberName(memberName);
user = login(request, null, memberName, PASSWORD_OF_METHOD_REALM, true);
((OnlineUserImpl)user).setAuthenticationType(OnlineUser.AUTHENTICATION_TYPE_REALM);
} catch (ObjectNotFoundException oe) {
// ignore
}
}
}
// now we have the user, check if it is a Guest and we can login in CUSTOM
boolean enableLoginInfoInCustomization = MVNForumConfig.getEnableLoginInfoInCustomization();
if (authenticator == null) {
authenticator = ManagerFactory.getAuthenticator();
}
if (authenticator != null) {
if (user.isGuest() && enableLoginInfoInCustomization && (null != authenticator.getRemoteUser(request))) {
String memberName = StringUtil.getEmptyStringIfNull(authenticator.getRemoteUser(request));
if (memberName.length() > 0) {
try {
DAOFactory.getMemberDAO().findByAlternateKey_MemberName(memberName);
user = login(request, null, memberName, PASSWORD_OF_METHOD_CUSTOMIZATION, true);
( (OnlineUserImpl) user).setAuthenticationType(OnlineUser.AUTHENTICATION_TYPE_CUSTOMIZATION);
} catch (ObjectNotFoundException oe) {
// ignore, the implementation of Authenticator should create the member in database first
}
}
}
}
}
user.getOnlineUserAction().updateLastRequestTime();
return user;
}
public Collection getOnlineUserActions(int sortOption, boolean duplicateUsers) {
Collection collection = userMap.values();
// @todo: find a better sollution, I dont want to copy the Collection
// this ArrayList is used to copy the values
ArrayList retValue = new ArrayList(collection.size());
// Get members first
if (duplicateUsers) {
for (Iterator memberIterator = collection.iterator(); memberIterator.hasNext(); ) {
OnlineUser onlineUser = (OnlineUser) memberIterator.next();
if (onlineUser.isMember()) {
OnlineUserAction onlineUserAction = onlineUser.getOnlineUserAction();
retValue.add(onlineUserAction);
}
}
} else {
// now we combine the duplicated users
Hashtable distinctUserActions = new Hashtable();
OnlineUserAction lastUserAction = null;
for (Iterator memberIterator = collection.iterator(); memberIterator.hasNext(); ) {
OnlineUser onlineUser = (OnlineUser) memberIterator.next();
if (onlineUser.isMember()) {
OnlineUserAction onlineUserAction = onlineUser.getOnlineUserAction();
String memberName = onlineUserAction.getMemberName();
onlineUserAction.resetSessionCount();
lastUserAction = (OnlineUserAction) distinctUserActions.get(memberName);
if (lastUserAction == null) {
distinctUserActions.put(memberName, onlineUserAction);
} else if (onlineUserAction.getLastRequestTime().after(lastUserAction.getLastRequestTime())) {
distinctUserActions.put(memberName, onlineUserAction);
onlineUserAction.increaseSessionCount(lastUserAction.getSessionCount());
} else {
lastUserAction.increaseSessionCount(1);
}
}
}
// now add the distinct member to the returned value
Collection distinctCollection = distinctUserActions.values();
for (Iterator iterator = distinctCollection.iterator(); iterator.hasNext(); ) {
OnlineUserAction onlineUserAction = (OnlineUserAction)iterator.next();
retValue.add(onlineUserAction);
}
}
// then get guest last
for (Iterator guestIterator = collection.iterator(); guestIterator.hasNext(); ) {
OnlineUser onlineUser = (OnlineUser)guestIterator.next();
if (onlineUser.isGuest()) {
OnlineUserAction onlineUserAction = onlineUser.getOnlineUserAction();
retValue.add(onlineUserAction);
}
}
return retValue;
}
public void updateOnlineUserAction(HttpServletRequest request, Action action)
throws AssertionException, DatabaseException, AuthenticationException {
if (action != null) {
OnlineUser onlineUser = getOnlineUser(request);
OnlineUserAction onlineUserAction = onlineUser.getOnlineUserAction();
// the setAction has package-default access
// so this is the only way to set action to a user
onlineUserAction.setAction(action);
}
}
public synchronized boolean isUserOnline(String username) {
Collection collection = userMap.values();
Iterator iterator = collection.iterator();
while (iterator.hasNext()) {
OnlineUser onlineUser = (OnlineUser)iterator.next();
String currentUser = onlineUser.getMemberName();
if (username.equalsIgnoreCase(currentUser)) {
return true;
}
}
return false;
}
/************************************************************************
* private methods
************************************************************************/
private synchronized OnlineUser getOnlineUser(String sessionID) {
return (OnlineUser)userMap.get(sessionID);
}
private synchronized void setOnlineUser(String sessionID, OnlineUser user) {
if (null == user) {
userMap.remove(sessionID);
} else {
userMap.put(sessionID, user);
}
}
private synchronized void removeTimeoutUsers() {
long currentTimeMillis = System.currentTimeMillis();
// try to resolve problem with synchronization on the class-varible : timeOfLastRemoveAction
if (currentTimeMillis - timeOfLastRemoveAction < REMOVE_INTERVAL) {
return;
}
// okie now, go ahead
timeOfLastRemoveAction = currentTimeMillis;
Timestamp currentTime = DateUtil.getCurrentGMTTimestamp();
Collection collection = userMap.values();
Iterator iterator = collection.iterator();
while (iterator.hasNext()) {
OnlineUser onlineUser = (OnlineUser)iterator.next();
OnlineUserAction onlineUserAction = onlineUser.getOnlineUserAction();
long duration = currentTime.getTime() - onlineUserAction.getLastRequestTime().getTime();
if (duration > MVNForumConfig.SESSION_DURATION) {
iterator.remove();
}
}
}
/************************************************************************
* Event method
************************************************************************/
public synchronized void removeOnlineUserListener(OnlineUserListener l) {
if (onlineUserListeners != null && onlineUserListeners.contains(l)) {
Vector v = (Vector) onlineUserListeners.clone();
v.removeElement(l);
onlineUserListeners = v;
}
}
public synchronized void addOnlineUserListener(OnlineUserListener l) {
Vector v = onlineUserListeners == null ? new Vector(2) : (Vector) onlineUserListeners.clone();
if (!v.contains(l)) {
v.addElement(l);
onlineUserListeners = v;
}
}
protected void fireDataChanged(OnlineUserEvent e) {
if (onlineUserListeners != null) {
Vector listeners = onlineUserListeners;
int count = listeners.size();
for (int i = 0; i < count; i++) {
((OnlineUserListener) listeners.elementAt(i)).dataChanged(e);
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -