web-dev-qa-db-fra.com

Comment définir un cookie dans Android client WebView

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.

12
Tixeon

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);
25
Tixeon

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);
    }
}
3
Alexiscanny

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

0
voghDev