2017-01-23 55 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在线,谁描述了这种行为,并且我经历了同样的行为。

如果有人有这个解决方案,我会很高兴。