Tengo un servicio web con el que intento autenticar en segundo plano mediante una vista web. Cuando inicialmente envío la solicitud, funcionará de manera adecuada (fracaso/éxito según las credenciales), pero después parece que recibo una respuesta en caché.Deshabilitar el almacenamiento en caché, las cookies y todo lo demás en un WebView
Aquí está mi vista web código de configuración:
WebView browser = new WebView(this);
WebSettings settings = browser.getSettings();
settings.setJavaScriptEnabled(true);
settings.setSavePassword(false);
settings.setCacheMode(WebSettings.LOAD_NO_CACHE);
settings.setAppCacheEnabled(false);
browser.setWebChromeClient(new WebChromeClient() {
public void onProgressChanged(WebView view, int progress) {
Log.d("BROWSERPROGRESS", Integer.toString(progress));
}
});
jsInterface = new AddAccountJSInterface();
browser.addJavascriptInterface(jsInterface, "ADDACCOUNTJSINTERFACE");
browser.setWebViewClient(new AddAccountClient(this));
Así como se puede ver que tengo dos clases adicionales que controlan mi web View:
- Un objeto que proporciona una interfaz para javascript (AddAccountJSInterface)
- A WebViewClient
Además, tengo un WebChromeClient, pero solo está disponible para la depuración y estoy bastante seguro de que no interferirá con nada.
La interfaz JS simplemente proporciona una manera fácil de obtener el cuerpo HTML para realizar análisis, por lo que estoy seguro de que ese no es el problema tampoco.
El WebViewClient tiene el siguiente código que hace la mayor parte del trabajo "personalizado" para el enrutamiento basado en varias respuestas del servicio web.
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if(url.contains(INSTALL_PREFIX)) {
HashMap<String, String> params = extractParameters(url);
verificationComplete(params);
return true;
}
return false;
}
@Override
public void onPageFinished(WebView view, String url){
if(invalidShop(view)) {
Toast.makeText(context, context.getString(R.string.no_find_shop), Toast.LENGTH_SHORT).show();
shopAddressField.requestFocus();
replaceUiElements(loadingBar, addAccountButton);
} else if(url.contains(ADMIN_AUTH_LOGIN)) {
if(invalidLogin(view)) {
Toast.makeText(context, context.getString(R.string.invalid_login),Toast.LENGTH_SHORT).show();
emailField.requestFocus();
replaceUiElements(loadingBar, addAccountButton);
} else {
String email = emailField.getText().toString();
String password = passwordField.getText().toString();
String submitJS = String.format(FORM_SUBMISSION_JS, email, password);
jsInterface.setInnerHTML("");
browser.loadUrl(submitJS);
}
}
}
En mi actividad Tengo 3 campos de texto que necesito llenar seguido haciendo clic en un botón para enviarlo. La actividad luego toma los datos de 3 campos de texto (shopAddressField, usernameField, passwordField) y luego ejecuta un javascript que rellena algunos datos del formulario (que se cargó en el invisible webView) y luego hace clic en el botón de enviar.
Es la última parte que está estropeando, que parece estar almacenando en caché la respuesta del servidor (¿quizás usando cookies?) Y la devuelve en lugar de preguntar al servidor si los datos son correctos o no.
Un poco de aclaración:
JSInterface es simplemente un objeto de Java que me permite ejecutar código JavaScript en mi vista web que está vinculado a una función dentro de ese objeto. En mi caso, mi JSInterface tiene una función que es setInnerHtml (String html).
Este es el código JavaScript que se ejecuta en la vista web:
javascript:window.ADDACOUNTJSINTERFACE.setInnerHTML(document.body.innerHTML)
Y esta es la función setInnerHtml:
public void setInnerHtml(String innerHtml) {
this.innerHtml = innerHtml;
}
Así que cuando realmente ejecutan jsInterface.setInnerHtml ("") I' Estoy escribiendo demasiado el código HTML que extrajo (para asegurarse de que no estoy obteniendo mis datos anteriores de allí por algún motivo). No
// submitJS will be something like this once all the credentials have been set
// Note: I know that the server will make jQuery available
// Note: Much of the Java string formatting has been removed to help clarify
// the code.
String submitJS =
"javascript:(function() {
$('login-input').value='username';
$('password').value='password';
$('sign-in-form').up().submit();
})()"
// I then simply get the webview to execute the javascript above
webView.loadData(submitJS);
quejarse en Twitter que su pregunta no está recibiendo la atención después de solo 45 minutos es insultante. Si desea respuestas garantizadas por debajo de la hora, contrate un consultor. Mientras tanto, considera explicar qué 'jsInterface.setInnerHTML (" ");' y 'submitJS' son, ya que dices que es donde reside tu problema. – CommonsWare
Disculpas. He agregado algunos detalles más sobre qué está haciendo exactamente el javascript y cómo estoy usando mi objeto java jsInterface. Espero que esto ayude a aclarar la pregunta un poco más. – csaunders
Complemento con este: "android.permission.DELETE_CACHE_FILES" en el archivo de manifiesto. –