我通過OKHttpClient帖子以用戶身份登錄,我想與webview共享cookie。OkHTTPClient將Cookie傳遞給Webview
回答
隨着OkHttp 3.0,你可以使用類似於通過使使用WebKit的cookie存儲一個WebkitCookieManagerProxy與HttpURLConnection的共享方法。改編自Pass cookies from HttpURLConnection (java.net.CookieManager) to WebView (android.webkit.CookieManager)。
public class WebkitCookieManagerProxy extends CookieManager implements CookieJar {
private android.webkit.CookieManager webkitCookieManager;
private static final String TAG = WebkitCookieManagerProxy.class.getSimpleName();
public WebkitCookieManagerProxy() {
this(null, null);
}
WebkitCookieManagerProxy(CookieStore store, CookiePolicy cookiePolicy) {
super(null, cookiePolicy);
this.webkitCookieManager = 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)) {
webkitCookieManager.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 = webkitCookieManager.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;
}
然後在構建OkHttpClient時添加代理的實例作爲cookieJar。
client = new OkHttpClient.Builder().cookieJar(proxy).build();
這很好用!謝謝! –
如何將以上內容與PersistentCookieStore一起使用https://stackoverflow.com/a/34886860/3286489? – Elye
此鏈接幫助,但我不得不改變我的用例的幾件事情:http://artemzin.com/blog/use-okhttp-to-load-resources-for-webview/
下面的代碼工作:
webView = (WebView) findViewById(R.id.webView);
WebSettings webSettings = webView.getSettings();
//enable javascript...
webSettings.setJavaScriptEnabled(true);
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
progress.dismiss();
}
@SuppressWarnings("deprecation")
@Override
public WebResourceResponse shouldInterceptRequest(@NonNull WebView view, @NonNull String url) {
return handleRequestViaOkHttp(url);
}
});
webView.loadUrl("MY_URL.COM");
然後,做了基本身份驗證+代碼處理攔截使用OkHTTPClient的webview請求。
@NonNull
private WebResourceResponse handleRequestViaOkHttp(@NonNull String url) {
try {
OkHttpClient client = new OkHttpClient();
client.setAuthenticator(new Authenticator() {
//for basic authorization...
@Override
public Request authenticate(Proxy proxy, com.squareup.okhttp.Response response) throws IOException {
String credential = Credentials.basic(CommonResource.HEADER_USERNAME, CommonResource.HEADER_PASSWORD);
return response.request().newBuilder().header("Authorization", credential).build();
}
@Override
public Request authenticateProxy(Proxy proxy, com.squareup.okhttp.Response response) throws IOException {
return null;
}
});
final Call call = client.newCall(new Request.Builder()
.url(url)
.build()
);
final Response response = call.execute();
return new WebResourceResponse("text/html", "UTF-8", response.body().byteStream());
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
這將是非常酷是有人想追加到代碼,以允許在現有的表格上發佈信息:) –
這不是一個好主意,請參閱https://artemzin.com/blog/android-webview-io/。 攔截webview網絡請求會使它們在chrome 47之前順序執行,而5.0之前的Android客戶端不會更新其web視圖。 – RyanCheu
- 1. 將Cookie傳遞給Android WebView
- 2. 將Cookie傳遞給Image.GetInstance
- 3. 將cookie傳遞給httpwebrequest
- 4. 將Cookie傳遞給Net :: HTTP.start
- 5. Webview - 將值從javascript傳遞給java
- 6. 將URL從WebView傳遞給ShareActionProvider?
- 7. 將登錄信息傳遞給webview
- 8. 如何將此憑據傳遞給WebView
- 9. 將Facebook SDK會話傳遞給webview
- 10. Xamarin - 從HttpClient將會話傳遞給WebView
- 11. 如何將javascript值傳遞給cookie
- 12. Android - 將Cookie傳遞給Opera Mobile
- 13. 將cookie傳遞給JSON請求
- 14. 如何將會話cookie傳遞給Uploadify?
- 15. 如何將xsrf cookie傳遞給主機?
- 16. 將cookie傳遞給我的瀏覽器
- 17. 將現有cookie傳遞給Web服務
- 18. 如何將cookie從jquery傳遞給PHP?
- 19. 如何將cookie傳遞給NSUrlSession?
- 20. DefaultHttpClient post獲取會話cookie並傳遞給WebView android
- 21. 以Cookie格式獲取Cookie並將其傳遞給CookieStore?
- 22. 我可以將Javascript對象傳遞給Android WebView嗎?
- 23. Android將觸摸事件傳遞給WebView的內容
- 24. 將活動值傳遞給Android webview的Javascript方法
- 25. 如何將Java中的值傳遞給Javascript嵌入Android WebView
- 26. 如何將html字符串傳遞給android上的webview
- 27. Android Webview將標題數據傳遞給Google Analytics
- 28. 將Android Activity中的值數組傳遞給WebView中的JavaScript
- 29. 如何將html字符串傳遞給另一個活動webView
- 30. 如何將JSON傳遞給Android webview中的AngularJS?
和你的問題是?如果是「我該怎麼做?」,那太寬泛了。如果它是「我在哪裏找到一個教程來做到這一點?」,那也將被關閉。你有特定的問題嗎? – njzk2
儘管這裏的簡短描述問題很明顯,但是由此重複:http://stackoverflow.com/questions/7610790/add-custom-headers-to-webview-resource-requests-android – Than