Android WebView - 带有经过身份验证的代理

时间:2011-11-23 01:11:35

标签: java android proxy android-webview

我目前正在尝试调试围绕WebView构建的Android应用。我负责处理的开发网络环境(不是我的选择,它是'企业'安全决策)是WPA WiFi +代理服务器+代理身份验证。

虽然very helpful previous answer上的说明很棒,但我正在尝试找到一种方法来配置代理主机:端口用户名:密码。

我的约束是:

  • 手机未植根 - 尝试重现客户报告的错误,宁愿不偏离典型的客户设置
  • 在Froyo上运行三星Galaxy S
  • 建立于2.1

Android应用程序不是我常用的东西,再次不是我的选择,所以如果我公然缺少细节,那就好了;)

2 个答案:

答案 0 :(得分:6)

使用WebView android proxy配置,对于基本方案抢先代理身份验证,

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

对于旧版本,可以通过反射在mProxyUserName mProxyPasswordandroid.webkit.Network设置抢先代理身份验证:

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

加载新网址时,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 :(得分:0)

请参阅此Related Answer