我想创建一个Android Webview,通过使用凭据通过安全的HTTPS
连接连接到网站。
第一个难点是接受证书(私人),它是用this非常有用的帖子解决的。
第二个难点是使用凭证,我发现this帖子。
(来自dparnas的第一个答案)似乎与它相处得很好,但它谈到的是HTTP
连接,而不是HTTPS
。我试过了,但它不起作用,我只是到达登录表单页面,没有任何错误消息,只是正常的空白表单。
这是我的代码:
import android.app.Activity;
import android.net.http.SslError;
import android.os.Bundle;
import android.webkit.HttpAuthHandler;
import android.webkit.SslErrorHandler;
import android.webkit.WebView;
import android.webkit.WebViewClient;
public class ConnectorWebView extends Activity {
WebView mWebView;
String mUsrName;
String mPassC;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.connwebview);
// Getting info from Intent extras
// Get it if it s different from null
Bundle extras = getIntent().getExtras();
mUsrName = extras != null ? extras.getString("username") : null;
mPassC = extras != null ? extras.getString("passcode") : null;
mWebView = (WebView) findViewById(R.id.webview);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.setHttpAuthUsernamePassword("myhost.com", "myrealm", mUsrName, mPassC);
mWebView.setWebViewClient(new WebViewClient() {
@Override
public void onReceivedHttpAuthRequest (WebView view, HttpAuthHandler handler, String host, String realm){
handler.proceed(mUsrName, mPassC);
}
public void onReceivedSslError (WebView view, SslErrorHandler handler, SslError error) {
handler.proceed() ;
}
});
mWebView.loadUrl("https://myhost.com/secured_area");
}
}
答案 0 :(得分:14)
由于WebView
在使用Basic
时无法原生地处理HTTPS
身份验证,因此我开始考虑设置Authorization
标头(包含编码的用户名/)密码)手动。
以下是我认为可以做到的事情:
import org.apache.commons.codec.binary.Base64;
// ...
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.connwebview);
// Getting info from Intent extras
// Get it if it s different from null
Bundle extras = getIntent().getExtras();
mUsrName = extras != null ? extras.getString("username") : null;
mPassC = extras != null ? extras.getString("passcode") : null;
mWebView = (WebView) findViewById(R.id.webview);
mWebView.getSettings().setJavaScriptEnabled(true);
// mWebView.setHttpAuthUsernamePassword("myhost.com",
// "myrealm",
// mUsrName,
// mPassC);
mWebView.setWebViewClient(new WebViewClient() {
@Override
public void onReceivedHttpAuthRequest(WebView view,
HttpAuthHandler handler,
String host,
String realm){
handler.proceed(mUsrName, mPassC);
}
public void onReceivedSslError(WebView view,
SslErrorHandler handler,
SslError error) {
handler.proceed() ;
}
});
String up = mUserName +":" +mPassC;
String authEncoded = new String(Base64.encodeBase64(up.getBytes()));
String authHeader = "Basic " +authEncoded;
Map<String, String> headers = new HashMap<String, String>();
headers.put("Authorization", authHeader);
mWebView.loadUrl("https://myhost.com/secured_area", headers);
}
这利用了WebView.loadUrl (String url, Map<String, String> additionalHttpHeaders)
方法,对于此示例,我使用Apache Commons中的Base64Encoder
。 Base64Encoder部分非常简单,如果您不想在应用程序中包含外部库(无论出于何种原因),您可以随时写下own(reference)。
另请注意,上述WebView.loadUrl (String url, Map<String, String> additionalHttpHeaders)
方法仅适用于API 8+。有关参考,请参阅关于Basic Authentication的维基百科文章(讨论标题等)。
答案 1 :(得分:3)
WebView类的连接灵活性不如直接使用低级类(如HttpPost等)。
如果您需要完全控制与服务器的连接 - 或处理复杂的授权方案(例如此方法) - 使用低级别类,检索数据,然后使用WebView.loadData()加载并显示HTML。
Here是使用SSL和BasicCredentialProvider加载内容的一个很好的示例。如上所述,可以将结果加载到WebView中。
答案 2 :(得分:0)
替代方案:
如果愿意写roundabout 10 lines of javascript using jQuery,这种情况相当简单。
Inject your javascript code into the webview或者如果您正在控制正在显示的html页面,请将其包含在那里。
如果您需要interface back from javascript,您可以这样做。对于更重的命令交换,请使用CordovaWebView
- 具有较低延迟的接口,具体取决于api级别。