在 Android 中截获 WebView 请求的最佳方式

2022-09-03 07:28:37

我正在使用一个必须拦截请求的应用程序。我目前正在使用folllwing代码来做到这一点。WebView

public WebResourceResponse shouldInterceptRequest (WebView view, String url) {
    HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
    conn.setRequestProperty("User-Agent", userAgent);

    String mime;
    if (url.lastIndexOf('.') > url.lastIndexOf('/')) {
        String ext = url.substring(url.lastIndexOf('.') + 1);
        mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(ext);
    } else {
       mime = "text/html";
    }
    return new WebResourceResponse(mime, "UTF-8", conn.getInputStream());
}

上述代码在大多数情况下工作正常,但不是全部。例如,当我尝试登录到Outlook时,它只是显示我的电子邮件或密码不正确,我还看到其他请求被破坏的情况,但是如果我删除,一切正常。shouldInterceptRequest

有没有比我当前用来拦截请求更好的方法?


答案 1

您的代码有两个问题

  1. 不正确的扩展名检测

例如,当代码尝试获取此 URL 的资源扩展时:

https://login.live.com/login.srf?wa=wsignin1.0&rpsnv=12&ct=1442476202&rver=6.4.6456.0&wp=MBI_SSL_SHARED&wreply=https:%2F%2Fmail.live.com%2Fdefault.aspx%3Frru%3Dinbox&lc=1033&id=64855&mkt=en-us&cbcxt=mai

它会返回,这是错误的。有一种特殊的方法可以从URL获取扩展:getFileExtensionFromUrl()aspx%3Frru%3Dinbox&lc=1033&id=64855&mkt=en-us&cbcxt=mai

  1. 根据文档方法 MimeTypeMap.getSingleton().getMimeTypeFromExtension(ext) 可能会返回 。在这种情况下,您的代码为页面设置了错误的 MIME 类型。null

下面是考虑这两个问题的方法代码

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

答案 2

推荐