【Ovirt 笔记】session 机制分析

2017-12-03  本文已影响74人  58bc06151329

文前说明

作为码农中的一员,需要不断的学习,我工作之余将一些分析总结和学习笔记写成博客与大家一起交流,也希望采用这种方式记录自己的学习之旅。

本文仅供学习交流使用,侵权必删。
不用于商业目的,转载请注明出处。

分析整理的版本为 Ovirt 3.4.5 版本。

用户登录

通过 LoginBaseCommandattachUserToSession 方法实现。

SessionDataContainer.getInstance().setUser(getParameters().getSessionId(), getCurrentUser());
SessionDataContainer.getInstance().setUserIp(getParameters().getIp());
SessionDataContainer.getInstance().setKind(getParameters().getKind());

用户登出

通过 LogoutUserCommandexecuteCommand() 方法实现。

public final void removeSession(String sessionId) {
    oldContext.remove(sessionId);
    newContext.remove(sessionId);
}

session 实现原理分析

SchedulerUtilQuartzImpl.getInstance().scheduleAFixedDelayJob(SessionDataContainer.getInstance(),
                    "cleanExpiredUsersSessions", new Class[] {}, new Object[] {},
                    sessionTimeoutInterval,
                    sessionTimeoutInterval, TimeUnit.MINUTES);
@TypeConverterAttribute(Integer.class)
@DefaultValueAttribute("30")
UserSessionTimeOutInterval,
@OnTimerMethodAnnotation("cleanExpiredUsersSessions")
public final void cleanExpiredUsersSessions() {
    deleteOldGeneration();
}
private Map<String, Map<String, Object>> deleteOldGeneration() {
    Map<String, Map<String, Object>> temp = oldContext;
    oldContext = newContext;
    newContext = new ConcurrentHashMap<String, Map<String, Object>>();
    return temp;
}
public final Object getData(String sessionId, String key, boolean refresh) {
    Map<String, Object> currentContext = null;
    if ((currentContext = newContext.get(sessionId)) != null) {
        return currentContext.get(key);
    }
    if (refresh) {
        if ((currentContext = oldContext.remove(sessionId)) != null) {
            newContext.put(sessionId, currentContext);
        }
    } else {
        currentContext = oldContext.get(sessionId);
    }
    if (currentContext != null) {
        return currentContext.get(key);
    }
    return null;
}

用户在界面上进行功能操作,使用 session,执行 getData 方法,设置 refreshtrue,表明续签 session

该操作会将 session 数据由 oldContext 列表迁移到 newContext 列表,并且等待下一次的 cleanExpiredUsersSessions 调用。

@Override
public void revealDefaultPlace() {
    // revealPlace(getDefaultPlace());
    PlaceRequest pr = getDefaultPlace();
    if (pr == null) {
        Window.Location.replace("/"); //$NON-NLS-1$
    } else {
        revealPlace(pr);
    }
}

protected PlaceRequest getDefaultPlace() {
    if (user.isLoggedIn()) {
        return getDefaultMainSectionPlace();
    } else {
        // return defaultLoginSectionRequest;
        return null;
    }
}
上一篇 下一篇

猜你喜欢

热点阅读