Intereting Posts
Каждый браузер, основанный на WebKit, разбивает сайты с помощью Omniture. Зачем? Компиляция библиотеки C для Android Кордова: Android SDK не найден. Убедитесь, что он установлен. Если он не находится по умолчанию, установите переменную среды ANDROID_HOME Понимание фрагментов backstack Как выйти из браузера Twitter в приложении в Android? Android Studio застряла в зависимостях разрешения градиента Статус Bluetooth Bluetooth 133 в onCharacteristicwrite Как использовать отладчик Eclipse в AsyncTask при разработке для Android? Android отчетов о сбоях (pre Froyo) Как кодировать и декодировать emoji в android? Proguard – AppCompat не поддерживает текущие функции темы после proguard / minify Изображения, которые не кэшируются локально (с помощью Universal Image Loader) – медленное время загрузки изображения Добавить java-библиотеку в проект Android Studio с репозиторием maven Ошибка в Eclipse (для Android): Тип java.lang.String не может быть разрешен. Это косвенно ссылается на требуемые файлы .class ExpandableListView с множественным выбором сохраняет выбранный элемент в массив

Установка учетных данных в веб-обозревателе Android с использованием защищенного соединения HTTPS

Я хотел бы создать Android Webview, который подключается к веб-сайту через защищенное соединение HTTPS с использованием учетных данных.

Первой трудностью было принять сертификат (частный), он был решен с этой очень полезной почтой.

Вторая трудность заключается в использовании учетных данных, я нашел этот пост.

(Первый ответ от 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"); } } 

Solutions Collecting From Web of "Установка учетных данных в веб-обозревателе Android с использованием защищенного соединения HTTPS"

Похоже, что 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) и для этого примера я использую Base64Encoder из Apache Commons . Часть Base64Encoder довольно тривиальна, и если вы не хотите включать внешние библиотеки в свое приложение (по какой-либо причине), вы всегда можете написать свою собственную ( ссылку ).

Также обратите внимание, что вышеупомянутый WebView.loadUrl (String url, Map<String, String> additionalHttpHeaders) доступен только в API 8+. Для справки см. Также статью Википедии об основной аутентификации (в которой обсуждаются заголовки и т. Д.).

Класс WebView не обеспечивает такую ​​гибкость в его подключении, как использование низкоуровневых классов (таких как HttpPost и т. П.) Напрямую.

Если вам нужно полностью контролировать соединение с сервером – или иметь дело со сложными сценариями авторизации, такими как этот, – используйте классы низкого уровня, извлекайте данные, а затем используйте WebView.loadData () для загрузки и отображения HTML.

Вот хороший пример загрузки контента с использованием SSL и BasicCredentialProvider. Результат этого может быть загружен в WebView, как описано выше.

Альтернативный сценарий :

Если вы захотите написать 10 строк javascript, используя jQuery , этот сценарий довольно прост.

Внесите свой javascript-код в веб-просмотр или, если вы контролируете отображаемую страницу html, включите ее там.

Если вам нужно подключиться обратно из javascript , вы можете это сделать. Для более интенсивного обмена командами используйте CordovaWebView -Interface, который имеет более низкую задержку в зависимости от уровня api.