2017-01-23 2 views
1

のWebViewでの要求をインターセプトするための私の現在のコードは、私が The best way to intercept a WebView request in Androidからこのコードを持って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()); 
    } 
} 

です。

ただし、認証を実行しようとするたびに、私は自分のwebviewでFacebookを読み込んでいます。

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

何も起こっていない、私が気づいたことは、要求ヘッダーが不完全であり、応答でもあります。また、ソースにクッキーはありません。 (私はChrome経由でWebビューをリモートでデバッグしたときにこれを見ました)。

私が間違っている場合は私を修正してください。しかし、不完全なヘッダーやCookieがないとログイン要求が失敗する原因になると思います。

リクエストを変更してヘッダーを設定する方法はありますか?またレスポンスのために、私もそれを行う必要がありますか?最後に、どのようにしてクッキーを持てますか?

答えて

1

この質問に6か月間回答していないので、まだ必要かどうかは分かりませんが、他の人に同様の質問があります。

リクエストヘッダが不完全である

あなたが必要な場合があります、どのリクエストヘッダを設定する責任を負うことになりますが、それはユーザエージェントを設定するのと同じくらい簡単ですHttpURLConnectionを使用しているあなたはすでにやりました: conn.setRequestHeader(header, value)または追加し、ヘッダー値を上書きしないようにしたい場合:conn.addRequestHeader(header, value)

また、あなたは一般的に期待されているヘッダのデフォルト値を追加する必要がありますされ、okhttp、HTTPクライアントを使用することができます。

何のクッキーは、要求をインターセプトすると、あなたもクッキーを処理するために担当することになります

ソースではありません。応答からヘッダーを解析することによって、手動でクッキーを保存することができます。

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

okhttpを使用しているときにも、あなたのクッキーを処理する必要があります可能性がありますが、再びあなたがCookieManagerなどを使用することができます上で述べた。詳細については、このドキュメントを参照してください。またはstackoverflow questionです。

私が間違っている場合は私を修正してください。不完全なヘッダーやCookieがないとログイン要求が失敗する原因になっていると思います。

WebViewにリクエストをインターセプトする際に別の問題が、あります:それは何らかの形でJavaScriptをロードし、評価を停止します。私はこれを見つけたblog by Artem Zinnatullinオンライン、誰がこの動作について説明し、私は同じ動作を経験した。

誰にでも解決策があるとすれば、私は非常に満足しています。

関連する問題