Okhttp传递cookie给Webview的解决方法

复制代码
public class WebkitCookieProxy extends CookieManager implements CookieJar {

  private android.webkit.CookieManager mWebkitCookieManager;

  private static final String TAG = WebkitCookieProxy.class.getSimpleName();

  public WebkitCookieProxy() {
    this(null, null);
  }

  WebkitCookieProxy(CookieStore store, CookiePolicy cookiePolicy) {
    super(store, cookiePolicy);
    this.mWebkitCookieManager = android.webkit.CookieManager.getInstance();
  }

  @Override
  public void put(URI uri, Map<String, List<String>> responseHeaders) throws IOException{
    // make sure our args are valid
    if ((uri == null) || (responseHeaders == null)) {
      return;
    }

    // save our url once
    String url = uri.toString();

    // go over the headers
    for (String headerKey : responseHeaders.keySet()) {
      // ignore headers which aren't cookie related
      if ((headerKey == null)
          || !(headerKey.equalsIgnoreCase("Set-Cookie2") || headerKey
          .equalsIgnoreCase("Set-Cookie"))) {
        continue;
      }

      // process each of the headers
      for (String headerValue : responseHeaders.get(headerKey)) {
        mWebkitCookieManager.setCookie(url, headerValue);
      }
    }
  }

  @Override
  public Map<String, List<String>> get(URI uri,
      Map<String, List<String>> requestHeaders) throws IOException {
    // make sure our args are valid
    if ((uri == null) || (requestHeaders == null)) {
      throw new IllegalArgumentException("Argument is null");
    }

    // save our url once
    String url = uri.toString();

    // prepare our response
    Map<String, List<String>> res = new java.util.HashMap<String, List<String>>();

    // get the cookie
    String cookie = mWebkitCookieManager.getCookie(url);

    // return it
    if (cookie != null) {
      res.put("Cookie", Arrays.asList(cookie));
    }

    return res;
  }

  @Override
  public CookieStore getCookieStore() {
    // we don't want anyone to work with this cookie store directly
    throw new UnsupportedOperationException();
  }

  @Override
  public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
    HashMap<String, List<String>> generatedResponseHeaders = new HashMap<>();
    ArrayList<String> cookiesList = new ArrayList<>();
    for (Cookie c : cookies) {
      // toString correctly generates a normal cookie string
      cookiesList.add(c.toString());
    }

    generatedResponseHeaders.put("Set-Cookie", cookiesList);
    try {
      put(url.uri(), generatedResponseHeaders);
    } catch (IOException e) {
      Log.e(TAG, "Error adding cookies through okhttp", e);
    }
  }

  @Override
  public List<Cookie> loadForRequest(HttpUrl url) {
    ArrayList<Cookie> cookieArrayList = new ArrayList<>();
    try {
      Map<String, List<String>> cookieList = get(url.uri(), new HashMap<String, List<String>>());
      // Format here looks like: "Cookie":["cookie1=val1;cookie2=val2;"]
      for (List<String> ls : cookieList.values()) {
        for (String s : ls) {
          String[] cookies = s.split(";");
          for (String cookie : cookies) {
            Cookie c = Cookie.parse(url, cookie);
            cookieArrayList.add(c);
          }
        }
      }
    } catch (IOException e) {
      Log.e(TAG, "error making cookie!", e);
    }
    return cookieArrayList;
  }
}

public static OkHttpClient createHttpClient() {
OkHttpClient.Builder builder = new OkHttpClient.Builder().cookieJar(new WebkitCookieProxy());
return builder.build();
}
 
复制代码

 

posted @   yongfengnice  阅读(934)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示