2017-01-23 87 views
1

我現在攔截在網頁視圖的請求的代碼是的Android攔截的WebView要求正確

@Override 
public WebResourceResponse shouldInterceptRequest(WebView view, 
    String url) { 
    String ext = MimeTypeMap.getFileExtensionFromUrl(url); 
    String mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(ext); 
    if (mime == null) { 
     return super.shouldInterceptRequest(view, url); 
    } else { 
     HttpURLConnection conn = (HttpURLConnection) new URL(
               url).openConnection(); 
     conn.setRequestProperty("User-Agent", userAgent); 
     return new WebResourceResponse(mime, "UTF-8", 
               conn.getInputStream()); 
    } 
} 

我得到這個代碼 The best way to intercept a WebView request in Android

但是,每當我嘗試執行身份驗證,讓我們說我在我的webview加載Facebook。

mWebView.loadUrl("https://www.facebook.com/"); 

什麼都沒有發生,我注意到的是,請求標頭是不完整的,也是響應。此外,來源中沒有Cookie。 (我通過Chrome遠程調試webview時看到了這一點)。

請糾正我,如果我錯了,但我認爲不完整的標題和缺少的cookie是導致登錄請求失敗的原因。

有沒有一種方法可以修改請求並設置其標頭?對於答覆,我也應該這樣做嗎?最後,我將如何獲得cookie。

回答

1

此問題尚未解答6個月,所以我不知道你是否仍然需要這個,但也許別人有類似的問題。

請求頭是不完整的

當使用HttpURLConnection,您將負責設置任何請求頭,你可能需要的,但它是作爲設定的User-Agent,就這麼簡單,你已經做了: conn.setRequestHeader(header, value),或者如果你想添加和不覆蓋頭值:conn.addRequestHeader(header, value)

或者,你可以使用okhttp,一個HTTP客戶端,它應該爲標題添加默認值,即通常的預期。

有在Sources

沒有cookie時攔截了請求,你也將負責處理餅乾。您可以通過解析響應中的標題來手動存儲cookie,例如

public WebResourceResponse shouldInterceptRequest(WebView view, 
     String url) { 
     // do your stuff 
     conn.connect(); // required to tell that the connection should be established 
     String cookie = getCookieFromConnection(conn); 
     // do more stuff and return WebResourceResponse 
    } 

    /** 
    * iterates all headers, and finds "cookie" headers 
    * (there could be more than one) 
    * @return cookie (concatenated value of all the found cookies) 
    * or null if no cookie has been found 
    */ 
    private String getCookieFromConnection(HttpURLConnection connection) { 
     String cookie = ""; 
     Map<String, List<String>> header = connection.getHeaderFields(); 
     List<String> cookies = header.get(COOKIE_HEADER); 
     if (cookies != null) { 
      for (String c : cookies) { 
       if (c != null) cookie += c + ";"; 
      } 
     } 
     if (cookie.isEmpty()) return null; 
     return cookie; 
} 

或者你可以使用一個CookieManager,它會處理你的一切:

cookieManager = new CookieManager(); 
    CookieHandler.setDefault(cookieManager); 
    cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL); 

你也將需要處理你的cookies,使用okhttp的時候,但你又可以使用CookieManager作爲綜上所述。有關更多詳細信息,請參閱此文檔或stackoverflow question

請糾正我,如果我錯了,但我認爲不完整的標題和缺少的cookie是導致登錄請求失敗的原因。

還有一個問題,當攔截WebView中的請求時:它以某種方式停止加載和評估JavaScript。我發現這個blog by Artem Zinnatullin在線,誰描述了這種行爲,並且我經歷了同樣的行爲。

如果有人有這個解決方案,我會很高興。