在 WebView 中拦截 POST 请求

新手上路,请多包涵

我正在开发一个过滤请求(使用白名单)并使用自定义 SSLSocketFactory 的 Android 应用程序。为此,我开发了一个自定义 WebViewClient 并且覆盖了 shouldInterceptRequest 方法。我可以过滤 GET 请求并将我的 SocketFactory 用于 GET 请求,但我无法拦截 POST 请求。

那么,有没有办法拦截 WebView 中的 POST 请求?

这是 shouldInterceptRequest 方法的代码:

 public final WebResourceResponse shouldInterceptRequest(WebView view, String urlStr) {
    URI uri = URI.create(urlStr);
    String scheme = uri.getScheme();
    // If scheme not http(s), let the default webview manage it
    if(!"http".equals(scheme) && !"https".equals(scheme)) {
        return null;
    }
    URL url = uri.toURL();

    if(doCancelRequest(url)) {
        // Empty response
        Log.d(TAG, "URL filtered: " + url);
        return new WebResourceResponse("text/plain", "UTF-8", new EmptyInputStream());

    } else {
        Log.d(TAG, "URL: " + url);

        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestProperty("User-Agent", mSettings.getUserAgentString());

        // Configure connections
        configureConnection(conn);

        String mimeType = conn.getContentType();
        String encoding = conn.getContentEncoding();

        if(mimeType != null && mimeType.contains(CONTENT_TYPE_SPLIT)) {
            String[] split = mimeType.split(CONTENT_TYPE_SPLIT);
            mimeType = split[0];

            Matcher matcher = CONTENT_TYPE_PATTERN.matcher(split[1]);
            if(matcher.find()) {
                encoding = matcher.group(1);
            }
        }

        InputStream is = conn.getInputStream();
        return new WebResourceResponse(mimeType, encoding, is);
    }
}

原文由 Fab_34 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.6k
1 个回答

几天前我遇到了同样的问题。

所以我建立了一个库来解决它:

https://github.com/KonstantinSchubert/request_data_webviewclient

它是一个带有自定义 WebResourceRequest 的 WebViewClient,其中包含 POST/PUT/… XMLHttpRequest 请求的有效负载。

它只适用于这些 - 不适用于表单和其他类型的请求源。

基本上,黑客通过将脚本注入 HTML 来拦截 XMLHttpRequest 调用。它记录 post/put/… 内容并将其发送到 android.webkit.JavascriptInterface 。在那里,请求被隐藏,直到 shouldInterceptRequest 方法被 Android 调用……

原文由 Konstantin Schubert 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏