All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cn.leancloud.session.AVSessionCacheHelper Maven / Gradle / Ivy

package cn.leancloud.session;

import cn.leancloud.AVLogger;
import cn.leancloud.cache.SystemSetting;
import cn.leancloud.core.AppConfiguration;
import cn.leancloud.im.AVIMOptions;
import cn.leancloud.im.Signature;
import cn.leancloud.utils.LogUtil;
import cn.leancloud.utils.StringUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

public class AVSessionCacheHelper {
  private static final AVLogger LOGGER = LogUtil.getLogger(AVSessionCacheHelper.class);
  private static final String SESSION_KEY = "sessionids";
  private static SessionTagCache tagCacheInstance;

  public static synchronized SessionTagCache getTagCacheInstance() {
    if (null == tagCacheInstance) {
      tagCacheInstance = new SessionTagCache();
    }
    return tagCacheInstance;
  }

  public static class SessionTagCache {
    private final static String SESSION_TAG_CACHE_KEY = "session_tag_cache_key";
    Map cachedTagMap = Collections.synchronizedMap(new HashMap());
    private SessionTagCache() {
      syncLocalToMemory(cachedTagMap);
    }
    private synchronized void syncTagsToLocal(Map map) {
      if (null != map) {
        AppConfiguration.getDefaultSetting().saveString(SESSION_KEY, SESSION_TAG_CACHE_KEY, JSON.toJSONString(map));
      }
    }
    private void syncLocalToMemory(Map map) {
      SystemSetting setting = AppConfiguration.getDefaultSetting();
      String sessionIdsString = setting.getString(SESSION_KEY, SESSION_TAG_CACHE_KEY, "{}");
      Map sessionIds = JSON.parseObject(sessionIdsString, HashMap.class);
      if (null != sessionIds && sessionIds.isEmpty()) {
        map.clear();
        map.putAll(sessionIds);
      }
    }

    void addSession(String clientId, String tag) {
      cachedTagMap.put(clientId, tag);
      if (AVIMOptions.getGlobalOptions().isAutoOpen()) {
        syncTagsToLocal(cachedTagMap);
      }
    }
     void removeSession(String clientId) {
       if (cachedTagMap.containsKey(clientId)) {
         cachedTagMap.remove(clientId);
         if (AVIMOptions.getGlobalOptions().isAutoOpen()) {
           syncTagsToLocal(cachedTagMap);
         }
       }
     }
    public Map getAllSession() {
      HashMap sessionMap = new HashMap<>();
      sessionMap.putAll(cachedTagMap);
      return sessionMap;
    }
  }

  public static class SignatureCache {
    private static final String SESSION_SIGNATURE_KEY = "com.avos.avoscloud.session.signature";
    public static void addSessionSignature(String clientId, Signature signature) {
      Map signatureMap = getSessionSignatures();
      signatureMap.put(clientId, signature);
      SystemSetting setting = AppConfiguration.getDefaultSetting();
      setting.saveString(SESSION_SIGNATURE_KEY, SESSION_KEY,
              JSON.toJSONString(signatureMap, SerializerFeature.WriteClassName));
    }

    public static Signature getSessionSignature(String clientId) {
      Map signatureMap = getSessionSignatures();
      return signatureMap.get(clientId);
    }
    private static Map getSessionSignatures() {
      SystemSetting setting = AppConfiguration.getDefaultSetting();
      String sessionSignatureString = setting.getString(SESSION_SIGNATURE_KEY, SESSION_KEY, "{}");
      Map signatureMap = JSON.parseObject(sessionSignatureString, Map.class);
      return signatureMap;
    }
  }

  static class IMSessionTokenCache {
    private static final String SESSION_TOKEN_KEY = "com.avos.avoscloud.session.token";

    /**
     * 用来缓存 sessionToken,sessionToken 用来做自动登录使用
     */
    private static Map imSessionTokenMap = new HashMap<>();

    static String getIMSessionToken(String clientId) {
      if (AVIMOptions.getGlobalOptions().isAutoOpen()) {
        SystemSetting setting = AppConfiguration.getDefaultSetting();
        String token = setting.getString(SESSION_TOKEN_KEY, clientId, null);
        String expiredAt = setting.getString(SESSION_TOKEN_KEY, getSessionTokenExpiredAtKey(clientId), null);
        if (!StringUtil.isEmpty(token) && !StringUtil.isEmpty(expiredAt)) {
          try {
            long expiredAtInLong = Long.parseLong(expiredAt);
            if (expiredAtInLong > System.currentTimeMillis()) {
              return token;
            }
          } catch (Exception e) {
            LOGGER.w(e);
          }
        }
      } else {
        if (imSessionTokenMap.containsKey(clientId)) {
          return imSessionTokenMap.get(clientId);
        }
      }
      return null;
    }

    /**
     * 将 sessionToken 写入缓存
     * 如果自动登录为 true,则写入本地缓存,否则只写入内存,默认写入内存的有效期为当前 app 的生命周期内
     *
     * @param clientId
     * @param realtimeSessionToken
     * @param expireInSec
     */
    static void addIMSessionToken(String clientId, String realtimeSessionToken, long expireInSec) {
      if (AVIMOptions.getGlobalOptions().isAutoOpen()) {
        SystemSetting setting = AppConfiguration.getDefaultSetting();
        setting.saveString(SESSION_TOKEN_KEY, clientId, realtimeSessionToken);
        setting.saveString(SESSION_TOKEN_KEY, getSessionTokenExpiredAtKey(clientId), String.valueOf(expireInSec));
      } else {
        imSessionTokenMap.put(clientId, realtimeSessionToken);
      }
    }

    /**
     * 删除 client 对应的 sessionToken
     *
     * @param clientId
     */
    static void removeIMSessionToken(String clientId) {
      if (AVIMOptions.getGlobalOptions().isAutoOpen()) {
        SystemSetting setting = AppConfiguration.getDefaultSetting();
        setting.removeKey(SESSION_TOKEN_KEY, clientId);
        setting.removeKey(SESSION_TOKEN_KEY, getSessionTokenExpiredAtKey(clientId));
      } else {
        imSessionTokenMap.remove(clientId);
      }
    }

    private static String getSessionTokenExpiredAtKey(String clientId) {
      return clientId + ".expiredAt";
    }
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy