WebView(AgentWeb)与H5之间交互时cookie的同步注意

 

同步的问题很常见,解决方法基本类似。

  /**
   * 给WebView同步Cookie
   *
   * @param context 上下文
   * @param url     可以使用[domain][host]
   */
  private void syncCookie(Context context, String url) {
    CookieSyncManager.createInstance(context);
    CookieManager cookieManager = CookieManager.getInstance();
    cookieManager.setAcceptCookie(true);
    cookieManager.removeSessionCookie();// 移除旧的[可以省略]
    List cookies = new PersistentCookieStore(context).getCookies();// 获取Cookie[可以是其他的方式获取]
    for (int i = 0; i < cookies.size(); i++) {
      HttpCookie cookie = cookies.get(i);
      String value = cookie.getName() + "=" + cookie.getValue();
      cookieManager.setCookie(url, value);
    }
    CookieSyncManager.getInstance().sync();// To get instant sync instead of waiting for the timer to trigger, the host can call this.
  }

注意:

  • 参数中的 URL在使用过程中基本是域名。例如 https://www.baidu.com/就可以使 www.baidu.com
  • Cookie 列表的获取根据自己项目的存储方式不同而不同。例如使用 SharedPreferences和 HashMap
  • 注意使用 for 循环进行 setCookie(String url, String value)调用。网上有博客表示使用分号手动拼接的 value值会导致 Cookie 不能完整设置或者无效
  • 注意 value的值是使用 key=value的完整形式。文档提示 the cookie as a string, using the format of the 'Set-Cookie' HTTP response header
  • CookieSyncManager是个过时的类,Api21 中 WebView 可以自动同步。
  • CookieSyncManager.getInstance().sync();方法的替代方法是 cookieManager.flush();
  • Cookie 同步方法要在 WebView 的 setting 设置完之后调用,否则无效。
  • 调用 loadUrl(url);前一句调用此方法进行 Cookie 同步操作。
AgentWeb 设置
String cookie = "token=1234567";
AgentWebConfig.syncCookie(target,cookie);

注意同上

 

 

你可能感兴趣的:(android)