4

Я использую приложение на основе webview, где я просматриваю URL-адрес в веб-просмотре. Url имеет HTTP-аутентификацию.Android-WebView onReceivedHttpAuthRequest() не вызван снова

Когда я запускаю URL-адрес в первый раз, вызывается его onReceivedHttpAuthRequest(), и я показываю диалоговое окно для ввода пользователем учетных данных аутентификации, которые являются именем пользователя и паролем.

@Override 
public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm) { 
     final WebView mView = view; 
     final HttpAuthHandler mHandler = handler; 

     final EditText usernameInput = new EditText(mActivity); 
     usernameInput.setHint("Username"); 

     final EditText passwordInput = new EditText(mActivity); 
     passwordInput.setHint("Password"); 
     passwordInput.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD); 

     LinearLayout ll = new LinearLayout(mActivity); 
     ll.setOrientation(LinearLayout.VERTICAL); 
     ll.addView(usernameInput); 
     ll.addView(passwordInput); 

     Builder authDialog = new AlertDialog 
       .Builder(mActivity) 
       .setTitle("Authentication") 
       .setView(ll) 
       .setCancelable(false) 
       .setPositiveButton("OK", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int whichButton) { 
         mHandler.proceed(usernameInput.getText().toString(), passwordInput.getText().toString()); 
         dialog.dismiss(); 
        } 
       }) 
       .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int whichButton) { 
         dialog.dismiss(); 
         mView.stopLoading(); 
         onLoadListener.onAuthCancel((MyWebView)mView, mTitleTextView); 
        } 
       }); 

     if(view!=null) 
      authDialog.show(); 

    } 

В ответ При отправке запроса все идет правильно и загружается URL. Но после того, как я выхожу из приложения, используя кнопку «Назад» (не отправляя фоновый рисунок), если я снова запустил его и вернул для загрузки того же URL-адреса, он напрямую загружает URL-адрес, не запрашивая учетные данные, который является onReceivedHttpAuthRequest() больше никогда не вызывается.

Я также клиринговых полномочия на приложение выхода, используя следующий код:

WebViewDatabase webDB = WebViewDatabase.getInstance(BrowserActivity.this); 
    if(webDB!=null){ 
     if(webDB.hasFormData()) 
      webDB.clearFormData(); 
     if(webDB.hasUsernamePassword()) 
      webDB.clearUsernamePassword(); 
     if(webDB.hasHttpAuthUsernamePassword()) 
      webDB.clearHttpAuthUsernamePassword(); 
    } 
webView.clearCache(true); 

Также я очистное все кэш WebView, куки и кэш-каталог приложения и базы данных WebView:

BrowserActivity.this.deleteDatabase("webview.db"); 
BrowserActivity.this.deleteDatabase("webviewCache.db"); 

Я не знаю, почему это происходит. Есть ли кто-нибудь, кто может мне помочь в этом. По крайней мере, на вопрос, почему onReceivedHttpAuthRequest() не называется?

+0

Вы уверены, что код, который вы должны очистить сохраненным именем пользователя/паролем, выполняется? – ksasq

+0

да, это выполнено. Также, когда я принудительно останавливаю приложение, а затем запускаю его, он запрашивает auth. – mohitum

+0

Хорошо, значит, это звучит только в том случае, если вы не используете кнопку «Назад»? Когда именно вы запускаете код, который очищает базу данных? – ksasq

ответ

0

Причиной этого является просмотр веб-магазина предыдущих файлов cookie. Поэтому нам нужно вручную очистить их и сохранить новые данные cookie для текущего URL-адреса. мы можем сделать это так.

HttpURLConnection connection = null; 
    try { 
     URL urls = new URL(url); 
     String authStr = ""; 
     if (!params.isEmpty()) { 
      authStr = params.get(0).getValue() + ":" 
        + params.get(1).getValue(); 
     } 

     String authEncoded = Base64.encodeBytes(authStr.getBytes()); 

     connection = (HttpURLConnection) urls 
       .openConnection(); 
     connection.setConnectTimeout(5100); 
     connection.setReadTimeout(5200); 
     connection.setDoOutput(false); 
     connection.setRequestProperty("Authorization", "Basic " 
       + authEncoded); 
     CookieManager cookieManager = CookieManager.getInstance(); 
     String cookie = cookieManager.getCookie(connection.getURL().toString()); 
     if (cookie != null) { 
      connection.setRequestProperty("Cookie", cookie); 
     } 
     connection.connect(); 

     responseCode = connection.getResponseCode(); 
     InputStream content = connection.getInputStream(); 
     response = convertStreamToString(content); 
     content.close(); 

     // Get cookies from responses and save into the cookie manager. session is created only in rest call url 
     List<String> cookieList = connection.getHeaderFields().get("Set-Cookie"); 
     if (cookieList != null) { 
      for (String cookieTemp : cookieList) { 
       cookieManager.setCookie(connection.getURL().toString(), cookieTemp); 
      } 
     } 

    }catch (SocketTimeoutException es){ 
     response = ConnectionStatus.TIME_OUT.name(); 
    } catch (Exception e) { 
     response = e.getMessage(); 
     e.printStackTrace(); 
    } 
    finally { 
     connection.disconnect(); 
    } 
1
  1. Перед нагрузкой URL, установите информацию авторизации в HTTP заголовках

    Карта extraHeaders = новый HashMap <>(); extraHeaders.put («Авторизация», «TlRM»); // значение не определено.
    webView.loadUrl (url, extraHeaders);

  2. в WebViewClient

    @Override общественности недействительным onReceivedHttpAuthRequest (вид WebView, HttpAuthHandler обработчик,
    Строка хоста, String область) { view.loadUrl (URL); // перезагрузить URL.
    handler.proceed (учетная запись, пароль); }

  3. Я решаю эту проблему, но я не могу говорить по-английски очень хорошо. Надеюсь, он может вам помочь.

Смежные вопросы