安卓WebView - 使用身份认证代理

4

我正在尝试调试一个基于WebView构建的Android应用程序。我需要处理的开发网络环境(不是我的选择,这是一项“企业级”安全决策)是WPA WiFi +代理服务器+代理身份验证。

虽然之前的回答上的说明非常有帮助,但我想找到一种同时配置代理主机:端口和用户名:密码的方法。

我的限制条件如下:

  • 手机未经root-尝试复制客户报告的错误,不想偏离典型客户设置
  • 在Froyo上运行三星Galaxy S
  • 构建版本为2.1

Android应用程序并不是我通常涉及的领域,如果我显然缺少细节,请多多包容;)

1个回答

6

使用 WebView android代理 配置进行基本方案抢先式代理认证时,

自Android 2.2开始,可以为身份验证设置额外的头部信息。以下代码可以为webView的http请求添加头部信息:

    public void loadUrl(WebView view, String url, String proxyUserName, String proxyPassword){
            UsernamePasswordCredentials creds= new UsernamePasswordCredentials(proxyUserName, proxyPassword);
            Header credHeader = BasicScheme.authenticate(creds, "UTF-8", true);
            Map<String, String> header = new HashMap<String, String>();
            header.put(credHeader.getName(), credHeader.getValue());
            view.loadUrl(url, header);
    }

对于旧版本,可以通过反射在 android.webkit.Network 中设置 mProxyUserNamemProxyPassword 以进行抢占式代理身份验证:

public void loadUrl(WebView view, String url, String proxyUserName, String proxyPassword){
    try{
        Class networkClass = Class.forName("android.webkit.Network");
        if (networkClass != null) {
            Object networkObj = invokeMethod(networkClass, "getInstance", new Object[]{view.getContext()}, Context.class);
            if (networkObj != null) {
                Field mProxyUserName = obj.getClass().getDeclaredField("mProxyUserName");
                mProxyUserName.setAccessible(true);mProxyUserName.set(networkObj, proxyUserName);
                Field mProxyPassword = obj.getClass().getDeclaredField("mProxyPassword");
                mProxyPassword.setAccessible(true);mProxyPassword.set(networkObj, proxyPassword);                       
            }
        }
    }catch(Exception e){
        e.printStackTrace();
    }
    view.loadUrl(url);
}

当您加载一个新的url时,loadUrl() 需要再次调用。这非常重要。 因此,应该使用自定义的 WebViewClient 来覆盖 shouldOverrideUrlLoading(WebView view, String url)

class ProxyAuthWebViewClient extends WebViewClient {
    String proxyUserName;
    String proxyPassword;
    public ProxyAuthWebViewClient(String proxyUserName, String proxyPassword){
        this.proxyUserName = proxyUserName;
        this.proxyPassword = proxyPassword;
    }
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        loadUrl(view, url, proxyUserName, proxyPassword);
        return true ;
    }
}

同时,在你的webView上设置WebViewClient:

webView.setWebViewClient(new ProxyAuthWebViewClient("user", "password"));

1
你好, 这个解决方案适用于Android 4.1吗? 有其他替代方案吗? 谢谢。 - toufik_at
@toufik_at,使用代理可能会因Android版本而异。但我确定在Android 2.2之后添加一个头部总是有效的。 - Yeung
设置WebViewClient是最好的实际答案! - MewX

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接