Je veux appeler une URL spécifique via WebView. La page ne peut être appelée que lorsque l'utilisateur est déjà connecté. J'utilise AsyncHttpClient bibliothèque pour effectuer l'appel de connexion. Une fois connecté avec succès, le chargement de l'URL via WebView ne semble pas reconnaître les en-têtes appropriés, notamment le cookie. Mon suspect est que les cookies ne sont pas synchronisés correctement entre HttpClient et HttpClient de WebView. Une idée pourquoi? . Voici comment j'utilise WebView
final WebView webView = (WebView) content.findViewById(R.id.web_travel_advisory);
String url = "http://mydomainurl.com/get_data_after_login";
webView.setWebViewClient(new WebViewClient());
CookieSyncManager.createInstance(getActivity());
CookieSyncManager.getInstance().startSync();
CookieManager.getInstance().setAcceptCookie(true);
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl(url);
Appréciez votre aide.
Ohh après plusieurs heures, j'ai finalement compris pour le faire fonctionner. Premièrement CookieSyncManager est déconseillé sur la version ultérieure de Android depuis l'api 21 selon la doc. Nous avons donc décidé de ne plus l'utiliser. Deuxièmement CookieManager est utilisé pour stocker des cookies pour WebView .
Code final
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
List<Cookie> cookies = WSHelper.cookieStore.getCookies();
cookieManager.removeAllCookie();
if (cookies != null) {
for (Cookie cookie : cookies) {
if (cookie.getName().contains("session")){
String cookieString = cookie.getName() + "=" + cookie.getValue() + "; Domain=" + cookie.getDomain();
cookieManager.setCookie(cookie.getDomain(), cookieString);
Log.d("CookieUrl",cookieString + " ");
}
}
}
webView.loadUrl(url);
Les principaux changements apportés à la solution sont les suivants: utilisez cookie.getDomain () au lieu du domaine explicite.
cookieManager.setCookie(cookie.getDomain(), cookieString);
Essayez ce code, après quelques modifications fonctionne pour moi:
public class WebViewActivity extends Activity{
private SharedPreferences mPreferences;
String token="";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.webviewpage);
mPreferences = getSharedPreferences("CurrentUser", MODE_PRIVATE);
}
public void LaunchWebView(View view) {
WebView myWebView = (WebView) findViewById(R.id.myWebView);
myWebView.getSettings().setJavaScriptEnabled(true);
myWebView.getSettings().setSaveFormData(false);
CookieSyncManager.createInstance(this);
CookieSyncManager.getInstance().startSync();
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
CookieManager.getInstance().setAcceptThirdPartyCookies(myWebView, true);
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
String token2= mPreferences.getString("auth_token","");
HashMap<String, String> map = new HashMap<String, String>();
map.put("x-auth-token", token);
myWebView.getSettings().setAppCacheEnabled(true);
myWebView.setWebViewClient(new WebViewClient() {
public boolean shouldOverrideUrlLoading(WebView view,String url) {
view.loadUrl(url);
return true;
}
});
myWebView.loadUrl("YOUR_URL", map);
}
}
Mon problème était légèrement différent, mais la réponse de @Tixeon m'a donné la clé pour le résoudre. Je composais mon cookie et je l'ajoutais à la demande WebView, mais j'ai découvert que Android remplaçait mon cookie et envoyait son propre cookie. Donc, tout d'abord, j'ai dû supprimer tous les cookies du tableau, puis composez mon propre cookie. Voici l'exemple de code:
// Note that my project has minSdkVersion 21, so I can directly use methods only available in Lollipop
private fun loadUrlInWebView(url: String) {
webView.settings.apply {
builtInZoomControls = false
javaScriptEnabled = true
useWideViewPort = true
loadWithOverviewMode = true
setSupportMultipleWindows(false)
}
CookieManager.getInstance().apply {
setAcceptThirdPartyCookies(webView, true) // My minSdkVersion is 21
removeAllCookies { value ->
Log.d("Cookies", "Removed all cookies from CookieManager")
}
}
webView.apply {
isVerticalScrollBarEnabled = true
isHorizontalScrollBarEnabled = true
loadUrl(
url,
mutableMapOf(
"Cookie" to "ThisIsMyCookieWithMyValues",
"Accept" to "*/*",
"Accept-Encoding" to "gzip, deflate",
"Cache-Control" to "no-cache",
"Content-type" to "application/x-www-form-urlencoded"
)
)
}
}
Maintenant, la demande contient mon cookie et non celui par défaut fourni par Android, et ma session dans WebView fonctionne. J'espère que ceci aide quelqu'un d'autre