2016-12-20 5 views
0

Ich habe viel Mühe herauszufinden, die Lösung für mein Problem. Ich beginne eine Webserver-Sitzung von Android zu einer PHP-Datei mit HttpsUrlConnection. Hier ist der Code, den ich verwende, um die Cookies zu setzen, während in auf den Web-Server anmelden, um die Sitzung Arbeit richtig zu machen:Share erstellt Sitzung zwischen HTTPURLCONNECTION und WebView

CookieManager cookieManager = new CookieManager(); 
CookieHandler.setDefault(cookieManager); 

Das scheint meine Session Arbeit richtig zu machen, was genau das ist, was ich wollte. Ich habe jedoch ein Problem. In einem Teil meiner App verwende ich eine Webansicht, die auf eine Seite zugreift, die nach die Anmeldeseite online ist. Also, damit es funktioniert, muss ich irgendwie meine Sitzung mit meinem JSONObject mittels HttpsUrlConnection senden, damit ich die Authentifizierung umgehen kann. Hier

ist der Code verwende ich für die WebView:

webView = (WebView) findViewById(R.id.webView); 
webView.getSettings().setJavaScriptEnabled(true);  
webView.loadUrl(URL); 

Es lädt die Seite in Ordnung, aber es ist nicht die Sitzung verwenden, die HttpsURLConnection verwendet. Ich kann HttpsUrlConnection immer wieder verwenden und es wird die Authentifizierung umgehen, da es den Cookie-Speicher verwendet und die PHP-Datei sich an die Sitzung erinnert. Ich kann nicht herausfinden, wie ich diese Cookies oder die Sitzung in einer Webansicht auf die gleiche Weise weitergeben soll, damit ich die Seite richtig verwenden kann.

Jede Hilfe würde sehr geschätzt werden.

EDIT: Ich löste dies durch eine benutzerdefinierten Cookie-Manager-Klasse erstellen, die Cookies für die Cookie und die Webansicht Cookie-Manager

Antwort

1

Das ist, weil die WebView hat seine eigenen CookieStor android.net.CookieManager genannt teilt. Und Sie haben eine Instanz von java.net.Cookiemanager erstellt. Sie kennen sich nicht. Sie müssen die Cookies zwischen diesen beiden austauschen.

1.) Erstellen Sie Ihre eigene Instanz von java.net.CookieManager, die eine Instanz von android.net.CookieManager bekommt:

public class MyCookieManager extends CookieManager { 

private android.webkit.CookieManager webkitCookieManager = null; 

/** 
* Constructor 
* @param cookieManager android.webkit.CookieManager 
* @param cookiePolicy CookiePolicy 
*/ 
public MyCookieManager (android.webkit.CookieManager cookieManager, CookiePolicy cookiePolicy) { 

    super(null, cookiePolicy); 
    this.webkitCookieManager = cookieManager; 
    //Cookies are allowed 
    this.webkitCookieManager.setAcceptCookie(true); 
} 

/** 
    * @param uri URI 
* @param responseHeaders Map<String, List<String>> 
*/ 
@Override 
public void put(URI uri, Map<String, List<String>> responseHeaders) { 

    if (responseHeaders == null) { 

     return; 
    } 

    for (String headerKey : responseHeaders.keySet()) { 

     if (headerKey == null || "Set-Cookie".equalsIgnoreCase(headerKey) == false) { 

      continue; 
     } 


     for (String headerValue : responseHeaders.get(headerKey)) { 


      webkitCookieManager.setCookie(uri.toString(), headerValue); 
     } 
    } 

} 

/** 
* @param uri URI 
* @param requestHeaders Map<String, List<String>> 
* @return Map<String, List<String>> 
*/ 
@Override 
public Map<String, List<String>> get(URI uri, Map<String, List<String>> requestHeaders) { 

    if (requestHeaders == null) { 

     return null; 
    } 

    Map<String, List<String>> res = new java.util.HashMap<String, List<String>>(); 

    // get cookies from Webview CookieManager 
    String cookie = webkitCookieManager.getCookie(uri.toString()); 

    if (cookie == null) { 

     cookie = ""; 
    } 
    res.put("Cookie", Arrays.asList(cookie)); 

    return res; 
} 
} 

2.) Und in Ihrer Anwendung-Klasse etwas wie folgt aus:

public class ApplicationWrapper extends Application { 

    private MyCookieManager manager = null; 

    @Override 
    public void onCreate() { 

     //some work... 
     this.initCookieManager(); 
     //some more work... 
    } 

    private void initCookieManager() { 

    this.manager = new MyCookieManager(
      CookieManager.getInstance(), 
      java.net.CookiePolicy.ACCEPT_ALL); 
    CookieHandler.setDefault(this.manager); 
} 

} 
Verwandte Themen