2015-07-03 11 views
13

Ich setze den Cookie in den Headern und rufen Sie WebView.loadUrl() mit diesem Header aber es (Cookie in Header) funktioniert nicht auf jedem Android-Gerät außer 4.4. Ich habe es auf Android-Versionen 4.2, 4.3, 4.4, 5.0 und 5.1 getestet.WebView.loadUrl (URL, Header) funktioniert nicht in Android

webView = (WebView) findViewById(R.id.web_view); 
webView.getSettings().setJavaScriptEnabled(true); 
webView.getSettings().setDomStorageEnabled(true); 
webView.getSettings().setBuiltInZoomControls(true); 
webView.getSettings().setDisplayZoomControls(false); 


HashMap <String, String> extraHeaders = new HashMap<String, String>(); 
extraHeaders.put("Cookie", "{cookie value}"); 


webView.setWebViewClient(new WebViewClient() { 
    public boolean shouldOverrideUrlLoading(WebView view, String url){ 
      view.loadUrl(url, extraHeaders); 
       return false; 
     } 
}); 

webView.loadUrl(url, extraHeaders); 

Antwort

2

Ich habe die Lösung für das Problem umgehen zu müssen, indem die benutzerdefinierte Cookie-Manager:

public class WebkitCookieManagerProxy extends CookieManager { 
    private android.webkit.CookieManager webkitCookieManager; 
    public WebkitCookieManagerProxy() { 
     this(null, null); 
    } 
    public 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)) { 
       this.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 = this.webkitCookieManager.getCookie(url); 
     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(); 
    } 
} 

und den benutzerdefinierten Cookie-Manager in Anwendungsklasse initialisieren oder wenn die Anwendung startet als:

android.webkit.CookieSyncManager.createInstance(this); 
android.webkit.CookieManager.getInstance().setAcceptCookie(true); 
WebkitCookieManagerProxy coreCookieManager = new WebkitCookieManagerProxy(null, java.net.CookiePolicy.ACCEPT_ALL); 
java.net.CookieHandler.setDefault(coreCookieManager); 
5

Es ist beceause von Cookie-Richtlinien, um es zu beheben, sollten Sie hinzufügen:

public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    super.init(); 

    // Allow third party cookies for Android Lollipop 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
     WebView webView = (WebView)super.appView; 
     CookieManager cookieManager = CookieManager.getInstance(); 
     cookieManager.setAcceptThirdPartyCookies(webView,true); 
    } 

    super.loadUrl(Config.getStartUrl()); 
} 
+1

Ich habe diese Lösung bereits versucht, aber nicht funktioniert – user1041858

6

Haben Sie versucht, diese

CookieManager.getInstance().setAcceptCookie(true); 
+2

Ja, aber nicht funktioniert – user1041858

6

, wenn Sie Android Lollipop verwenden, dann

CookieManager.getInstance().setAcceptCookie(true); 

wird nicht funktionieren. Sie müssen

CookieManager.getInstance().setAcceptThirdPartyCookies(true); 
6

verwenden Cookies, die folgende Methode verwendet gesetzt

CookieManager.getInstance().setCookie(BuildConfig.BASE_SERVER_ENDPOINT,COOKIE_VAL); 

Sicherstellen, dass der Basis-Endpunkt entspricht die Basis-URL der in der Webansicht geöffnet Links.

Um Cookie

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
       CookieManager.getInstance().removeAllCookies(null); 
      } else { 
       CookieManager.getInstance().removeAllCookie(); 
      } 
5

Diese über das Hinzufügen von Cookies zu einer Web-Ansicht entfernen Sie einfach eine kurze Nachricht ist. Wenn Sie jemals versucht haben, dies so zu tun, wie die meisten Leute gesagt haben, dass es getan werden sollte, sind Sie kläglich gescheitert und haben diesen Beitrag gefunden. :)

Die Art, wie es funktionieren soll, ist, dass Sie den Cookie auf dem CookieManager setzen und dann den CookieSyncManager anweisen, ihn zu synchronisieren.

CookieManager.getInstance().setCookie(domain, value); 
CookieSyncManager.getInstance().sync(); 

Ich habe nie das funktioniert wie beschrieben. Mit oder ohne asynchronen Aufgaben, die darauf warten, dass die Threads aufholen.

Stattdessen füge ich einfach den Cookie in der Kopfzeile aller Aufrufe von loadUrl.

Map<String, String> headers = new HashMap<String, String>(); 
headers.put("Cookie", "cookieName=cookieValue;domain=domain.com;path=/;Expires=Thu, 2 Aug 2021 20:47:11 UTC;"); 
webView.loadUrl("myurl.com", headers); 

Caveat: Ich habe nur müssen zunächst für die Anforderung das entsprechende Cookie laden, wenn Sie verschachtelte Anrufe abdecken wollen von innerhalb des Browsers, müssen Sie shouldOverrideUrlLoading außer Kraft zu setzen.

webView.setWebViewClient(new WebViewClient() { 
    @Override 
    public boolean shouldOverrideUrlLoading(WebView view, String url) { 
     view.loadUrl(url, headers); 
     return false; 
    } 
}); 

Wenn Sie das Cookie für alle Anforderungen (einschließlich Bilder, js, usw.) zu injizieren, Sie gehen shouldInterceptRequest,

0

Wenn Sie mit Android Lollipop heißt SDK 21, dann:

CookieManager.getInstance().setAcceptCookie(true); 

wird nicht funktionieren.Sie müssen verwenden:

CookieManager.getInstance().setAcceptThirdPartyCookies(true); 

Ich lief in das gleiche Problem und die obige Linie arbeitete als Charme.

Verwandte Themen