RPC-GWT Serialization/java.util.Date 编码

RPC-GWT Serialization/java.util.Date Encoding

我正在创建序列化 GWT 请求的脚本,但我在编码日期值以符合 RPC-GWT 标准时遇到问题。通过 HTTP 日志,我注意到日期值被转换为一些 7 个字符的字符串,但我无法识别这些模式使用的算法。

有谁知道使用哪种算法来加密这些日期值?

这些日期值被序列化为长值 => 自纪元(1970 年 1 月 1 日)以来的毫秒数,然后以打包形式序列化为 base64 以成为更短的字符串。看这里:

/**
   * Parse a string containing a base-64 encoded version of a long value.
   *
   * Keep this synchronized with the version in Base64Utils.
   */
  static long longFromBase64(String value) {
    int pos = 0;
    long longVal = base64Value(value.charAt(pos++));
    int len = value.length();
    while (pos < len) {
      longVal <<= 6;
      longVal |= base64Value(value.charAt(pos++));
    }
    return longVal;
  }
  /**
   * Return an optionally single-quoted string containing a base-64 encoded
   * version of the given long value.
   *
   * Keep this synchronized with the version in Base64Utils.
   */
  static String longToBase64(long value) {
    // Convert to ints early to avoid need for long ops
    int low = (int) (value & 0xffffffff);
    int high = (int) (value >> 32);
    StringBuilder sb = new StringBuilder();
    boolean haveNonZero = base64Append(sb, (high >> 28) & 0xf, false);
    haveNonZero = base64Append(sb, (high >> 22) & 0x3f, haveNonZero);
    haveNonZero = base64Append(sb, (high >> 16) & 0x3f, haveNonZero);
    haveNonZero = base64Append(sb, (high >> 10) & 0x3f, haveNonZero);
    haveNonZero = base64Append(sb, (high >> 4) & 0x3f, haveNonZero);
    int v = ((high & 0xf) << 2) | ((low >> 30) & 0x3);
    haveNonZero = base64Append(sb, v, haveNonZero);
    haveNonZero = base64Append(sb, (low >> 24) & 0x3f, haveNonZero);
    haveNonZero = base64Append(sb, (low >> 18) & 0x3f, haveNonZero);
    haveNonZero = base64Append(sb, (low >> 12) & 0x3f, haveNonZero);
    base64Append(sb, (low >> 6) & 0x3f, haveNonZero);
    base64Append(sb, low & 0x3f, true);
    return sb.toString();
  }
  private static boolean base64Append(StringBuilder sb, int digit, boolean haveNonZero) {
    if (digit > 0) {
      haveNonZero = true;
    }
    if (haveNonZero) {
      int c;
      if (digit < 26) {
        c = 'A' + digit;
      } else if (digit < 52) {
        c = 'a' + digit - 26;
      } else if (digit < 62) {
        c = '0' + digit - 52;
      } else if (digit == 62) {
        c = '$';
      } else {
        c = '_';
      }
      sb.append((char) c);
    }
    return haveNonZero;
  }
  // Assume digit is one of [A-Za-z0-9$_]
  private static int base64Value(char digit) {
    if (digit >= 'A' && digit <= 'Z') {
      return digit - 'A';
    }
    // No need to check digit <= 'z'
    if (digit >= 'a') {
      return digit - 'a' + 26;
    }
    if (digit >= '0' && digit <= '9') {
      return digit - '0' + 52;
    }
    if (digit == '$') {
      return 62;
    }
    // digit == '_'
    return 63;

 }

我在PHPColin Alworth

的指导下自己完成的

有关详细信息,GWT 项目发布了库 gwt-userhttps://mvnrepository.com/artifact/com.google.gwt/gwt-user) which contains the class Base64Utils can help to encode/decode to Base64 as described here: http://www.gwtproject.org/javadoc/latest/com/google/gwt/user/server/Base64Utils.html

我使用以下代码将日期转换为 GWT Base64 字符串(7 个字符):

public String dateToGWTString(Date date) {
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");

    try {
        Date dateWithoutTime = simpleDateFormat.parse(simpleDateFormat.format(date));
        return Base64Utils.toBase64(dateWithoutTime.getTime());
    } catch (ParseException e) {
        e.printStackTrace();
    }

    return null;
}