📄 onlineusermanager.java
字号:
throws AuthenticationException, DatabaseException, AssertionException {
long currentTime = System.currentTimeMillis();
if (currentTime - timeOfLastRemoveAction > REMOVE_INTERVAL) {//update every minute
removeTimeoutUsers();
// update MostOnline here
int currentOnlineUserCount = userMap.size();
fireDataChanged(new OnlineUserEvent(this, currentOnlineUserCount));
}
HttpSession session = request.getSession();
String sessionID = session.getId();
OnlineUser user = getOnlineUser(sessionID);
if (user == null) {
boolean enableLoginInfoInCookie = MVNForumConfig.getEnableLoginInfoInCookie();
boolean enableLoginInfoInSession = MVNForumConfig.getEnableLoginInfoInSession();
boolean enableLoginInfoInRealm = MVNForumConfig.getEnableLoginInfoInRealm();
boolean enableLoginInfoInCustomization = MVNForumConfig.getEnableLoginInfoInCustomization();
if ((user == null) && enableLoginInfoInSession) {
String memberName = ParamUtil.getAttribute(session, MVNFORUM_SESSION_USERNAME);
String encodedPassword = ParamUtil.getAttribute(session, MVNFORUM_SESSION_PASSWORD);
if ( (memberName.length() > 0) && (encodedPassword.length() > 0)) {
user = login(request, null, memberName, encodedPassword, true);
((OnlineUserImpl)user).setAuthenticationType(OnlineUser.AUTHENTICATION_TYPE_SESSION);
}
}
if ((user == null) && enableLoginInfoInCookie) {
String memberName = "";
String encodedPassword = "";
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (int i = 0; i < cookies.length; i++) {
Cookie cookie = cookies[i];
String cookieName = cookie.getName();
if (cookieName.equals(MVNFORUM_COOKIE_USERNAME)) {
memberName = cookie.getValue();
} else if (cookieName.equals(MVNFORUM_COOKIE_PASSWORD)) {
encodedPassword = cookie.getValue();
}
}
}
if ( (memberName.length() > 0) && (encodedPassword.length() > 0)) {
try {
//System.out.println("cookie membername = " + memberName + " cookie pw = " + encodedPassword);
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 ) {
user = login(request, null, memberName, "Realm", true);
((OnlineUserImpl)user).setAuthenticationType(OnlineUser.AUTHENTICATION_TYPE_REALM);
}
}
if ((user == null) && enableLoginInfoInCustomization) {
if (authenticator == null) {
authenticator = ManagerFactory.getAuthenticator();
}
if (authenticator != null) {
String memberName = StringUtil.getEmptyStringIfNull(authenticator.getRemoteUser(request));
if (memberName.length() > 0) {
user = login(request, null, memberName, "Remote", true);
((OnlineUserImpl)user).setAuthenticationType(OnlineUser.AUTHENTICATION_TYPE_CUSTOMIZATION);
}
}
}
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 ) {
user = login(request, null, memberName, "Realm", true);
((OnlineUserImpl)user).setAuthenticationType(OnlineUser.AUTHENTICATION_TYPE_REALM);
}
}
// 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) {
user = login(request, null, memberName, "Remote", true);
( (OnlineUserImpl) user).setAuthenticationType(OnlineUser.AUTHENTICATION_TYPE_CUSTOMIZATION);
}
}
}
}
user.getOnlineUserAction().updateLastRequestTime();
return user;
}
public Collection getOnlineUserActions(int sortOption) {
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
Iterator memberIterator = collection.iterator();
while (memberIterator.hasNext()) {
OnlineUser onlineUser = (OnlineUser)memberIterator.next();
if (onlineUser.isMember()) {
OnlineUserAction onlineUserAction = onlineUser.getOnlineUserAction();
retValue.add(onlineUserAction);
}
}
// then get guest last
Iterator guestIterator = collection.iterator();
while (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 + -