android webview与https连接和基本身份validation。 如何得到这个工作?

我研究过这个研究和研究,直到我变得灰白的。 我怎么能得到一个webview工作的网站,需要HTTP基本authentication通过https连接在API级别8 +

我有以下代码

String email = Util.getEmail(this); String pwd = Util.getPassword(this); webview.getSettings().setJavaScriptEnabled(true); webview.setHttpAuthUsernamePassword(Config.SERVER_BASE_URL, "Application", email, pwd); // webview.setWebViewClient(new MobileWebViewClient(this)); webview.loadUrl(url); 

正如你可以看到我有一个Web视图客户端(现在注释掉),覆盖onReceivedHttpAuthRequest方法,看起来像这样

 @Override public void onReceivedHttpAuthRequest (WebView view, HttpAuthHandler handler, String host, String realm){ String email = Util.getEmail(wvContext); String pwd = Util.getPassword(wvContext); if(!pwd.equalsIgnoreCase("-1") && !pwd.equalsIgnoreCase("-1")){ handler.proceed(email, pwd); } } 

这是使用没有webview.setHttpAuthUsernamePassword和工作正常,除了这意味着2请求发送到网站 – 第一个得到一个401,然后客户端与授权的东西踢这对于less量的网站stream量罚款,但减半交通量(目前平均49个请求P / M)是现在的游戏的名称!

我读过,我可以通过使用先发制人地提供凭证

 webview.setHttpAuthUsernamePassword(Config.SERVER_BASE_URL, "Application", email, pwd); 

然而,这只是导致Http基本:访问被拒绝的错误服务器基础的URL常量是网站的域名,即https://example.com (不含页面),实际的url是https://example.com/some_pages 。 无论我使用完整的url还是域名,这都没有区别。 我已经检查了领域,我有这个正确的,我只用空string只提供电子邮件和密码。 这可能是与该网站使用https的事实? 我的代码似乎在没有https的情况下工作正常,但可能是一个红色的鲱鱼。

似乎覆盖我的要求的唯一堆栈溢出问题还没有得到接受的答案,文档没有帮助,我可以看到。

我现在头上有一个很大的凹痕,把它撞在一堵砖墙上,我想要一个方帽子。

请任何人都可以给我解决这个问题我将永远在你的债务! 我甚至可以通过电子邮件给你一个KitKat

Solutions Collecting From Web of "android webview与https连接和基本身份validation。 如何得到这个工作?"

这个简单的例子滥用HttpWatch上的一个页面,因为它是一个工作的公共示例更有趣。

有问题的资源, https://www.httpwatch.com/httpgallery/authentication/authenticatedimage/default.aspx?randomgarbage //www.httpwatch.com/httpgallery/authentication/authenticatedimage/default.aspx https://www.httpwatch.com/httpgallery/authentication/authenticatedimage/default.aspx?randomgarbage使用HTTPS的基本身份validation,并可以像这样的身份validation失败加载(使用Android 2.3.7testing):

  WebView v = ...; // Your webview goes here. try { HashMap<String, String> map = new HashMap<String, String>(); // This test service takes the username "httpwatch" and a random // password. Repeating a password can lead to failure, so we create // a decently random one using UUID. String usernameRandomPassword = "httpwatch:" + UUID.randomUUID().toString(); String authorization = "Basic " + Base64.encodeToString(usernameRandomPassword.getBytes("UTF-8"), Base64.NO_WRAP); map.put("Authorization", authorization); v.loadUrl("https://www.httpwatch.com/httpgallery/authentication/authenticatedimage/default.aspx?" + System.currentTimeMillis(), map); } catch (UnsupportedEncodingException e) {} 

这适用于ICS和姜饼。 不能访问任何比这更老的东西,但loadUrl(String, Map<String,String>)是在API级别8中引入的,所以我不明白为什么它不适用loadUrl(String, Map<String,String>)

澄清尿布:

为了支持后续请求的身份validation,请提供WebViewClient并执行以下操作:

  webView.setWebViewClient(new WebViewClient(){ @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url, <your map containing the Authorization header>); return true; } }); 

它将工作在https URL。在这个如果我们得到Untrusted_cer,那么我们将忽略它

  webview.setWebViewClient(new WebViewClient(){ @Override public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm) { super.onReceivedHttpAuthRequest(view, handler, host, realm); } @Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { super.onReceivedSslError(view, handler, error); if(error.getPrimaryError()==SslError.SSL_UNTRUSTED){ handler.proceed(); }else{ handler.proceed(); } } }); 

我不知道第二个问题

为了在你的网站上处理授权,只需在你的webViewClient中覆盖下面的方法,并在其处理程序中添加用户名和密码。

 @Override public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm) { handler.proceed(StringUtils.AUTH_NAME,StringUtils.AUTH_PASS); }