2015-07-03 18 views
13

Tôi đang đặt cookie trong tiêu đề và gọi WebView.loadUrl() với tiêu đề này nhưng nó (Cookie trong tiêu đề) sẽ không hoạt động trên bất kỳ thiết bị Android nào ngoại trừ 4.4. Tôi đã thử nghiệm nó trên các phiên bản Android 4.2, 4.3, 4.4, 5.0 và 5.1.WebView.loadUrl (url, tiêu đề) không hoạt động trong 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); 

Trả lời

2

tôi có giải pháp cho vấn đề này bằng cách tạo ra quản lý cookie tùy chỉnh:

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(); 
    } 
} 

Và khởi tạo quản lý cookie tùy chỉnh trong lớp ứng dụng hoặc khi ứng dụng bắt đầu như:

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

Đó là beceause Chính sách Cookie, để sửa chữa nó, bạn nên thêm này:

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

Tôi đã thử giải pháp này nhưng không hoạt động – user1041858

6

Các bạn đã thử này

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

Có, nhưng không hoạt động – user1041858

6

nếu bạn đang sử dụng Android Lollipop, sau đó

CookieManager.getInstance().setAcceptCookie(true); 

sẽ không hoạt động. Bạn cần phải sử dụng

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

Để thiết lập cookie sử dụng phương pháp sau đây

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

Hãy chắc chắn rằng các thiết bị đầu cuối cơ sở phù hợp với địa chỉ cơ sở trong các liên kết mở trong webview.

Để xoá cookie

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

Đây chỉ là một bài nhanh chóng về việc thêm các tập tin cookie để một cái nhìn web. Nếu bạn đã từng cố gắng làm điều này theo cách mà hầu hết mọi người đã nói rằng điều đó nên được thực hiện, bạn đã thất bại thảm hại và tìm thấy bài đăng này. :)

Cách hoạt động của nó là bạn đặt cookie trên CookieManager và sau đó yêu cầu CookieSyncManager đồng bộ hóa.

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

Tôi chưa bao giờ làm việc này như được mô tả. Có hoặc không có tác vụ không đồng bộ đang chờ các chủ đề bắt kịp.

Thay vào đó, tôi chỉ thêm cookie vào tiêu đề của tất cả lệnh gọi hàm Url.

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: Tôi chỉ cần bước đầu tải các tập tin cookie phù hợp với yêu cầu, nếu bạn muốn để trang trải cuộc gọi lồng nhau từ bên trong trình duyệt, bạn cần phải ghi đè shouldOverrideUrlLoading.

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

Nếu bạn cần phải tiêm cookie cho tất cả các yêu cầu (bao gồm cả hình ảnh, js, vv), bạn sẽ cần phải ghi đè shouldInterceptRequest,

0

Nếu bạn đang sử dụng Android Lollipop ví dụ SDK 21, sau đó:

CookieManager.getInstance().setAcceptCookie(true); 

sẽ không hoạt động.Bạn cần sử dụng:

CookieManager.getInstance().setAcceptThirdPartyCookies(true); 

Tôi gặp vấn đề tương tự và dòng trên làm việc như một sự quyến rũ.

Các vấn đề liên quan