Maintain Cookie-Sitzung in Android

Okay, ich habe eine Android-Anwendung, die ein Formular enthält, zwei EditText, einen Drehknopf und eine Anmeldeschaltfläche. Der Benutzer wählt den Dienst aus dem Drehfeld aus, gibt seinen Benutzernamen und sein Kennwort ein und klickt auf Anmelden. Die Daten werden per POST gesendet, eine Antwort wird zurückgesendet, sie werden verarbeitet, ein neues WebView wird gestartet, die aus der Antwort generierte HTML-Zeichenfolge wird geladen und ich habe die Homepage des vom Benutzer ausgewählten Dienstes.

Das ist alles schön und gut. Wenn der Benutzer nun auf einen Link klickt, werden die Anmeldeinformationen nicht gefunden, und die Seite fordert den Benutzer auf, sich erneut anzumelden. Meine Anmeldesitzung wird irgendwo gelöscht, und ich bin nicht sicher, wie ich die Informationen aus der Klasse, die den Hauptteil meiner App steuert, an die Klasse weiterleiten soll, die gerade die Webview-Aktivität startet.

Der onClick-Handler über die Formularanmeldeschaltfläche:

private class FormOnClickListener implements View.OnClickListener {

    public void onClick(View v) {

        String actionURL, user, pwd, user_field, pwd_field;

        actionURL = "thePageURL";
        user_field = "username"; //this changes based on selections in a spinner
        pwd_field = "password"; //this changes based on selections in a spinner
        user = "theUserLogin";
        pwd = "theUserPassword";

        List<NameValuePair> myList = new ArrayList<NameValuePair>();
        myList.add(new BasicNameValuePair(user_field, use,r)); 
        myList.add(new BasicNameValuePair(pwd_field, pwd));

        HttpParams params = new BasicHttpParams();
        DefaultHttpClient client = new DefaultHttpClient(params);
        HttpPost post = new HttpPost(actionURL);
        HttpResponse response = null;
        BasicResponseHandler myHandler = new BasicResponseHandler();
        String endResult = null;

        try { post.setEntity(new UrlEncodedFormEntity(myList)); } 
        catch (UnsupportedEncodingException e) { e.printStackTrace(); } 

        try { response = client.execute(post); } 
        catch (ClientProtocolException e) { e.printStackTrace(); } 
        catch (IOException e) { e.printStackTrace(); }  

        try { endResult = myHandler.handleResponse(response); } 
        catch (HttpResponseException e) { e.printStackTrace(); } 
        catch (IOException e) { e.printStackTrace(); }

        List<Cookie> cookies = client.getCookieStore().getCookies();
        if (!cookies.isEmpty()) {
            for (int i = 0; i < cookies.size(); i++) {
                cookie = cookies.get(i);
            }
        }

       Intent myWebViewIntent = new Intent(MsidePortal.this, MyWebView.class);
       myWebViewIntent.putExtra("htmlString", endResult);
       myWebViewIntent.putExtra("actionURL", actionURL);
       startActivity(myWebViewIntent);
    }
}

Und hier ist die WebView-Klasse, die die Antwortanzeige verarbeitet:

public class MyWebView extends android.app.Activity {

    private class MyWebViewClient extends WebViewClient {

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return true;
        }
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.web);

        MyWebViewClient myClient = new MyWebViewClient();
        WebView webview = (WebView)findViewById(R.id.mainwebview);
        webview.getSettings().setBuiltInZoomControls(true); 
        webview.getSettings().setJavaScriptEnabled(true); 
        webview.setWebViewClient(myClient);

        Bundle extras = getIntent().getExtras();
        if(extras != null) 
        {
            // Get endResult
            String htmlString = extras.getString("htmlString");
            String actionURL = extras.getString("actionURL");

            Cookie sessionCookie = MsidePortal.cookie;
            CookieSyncManager.createInstance(this);
            CookieManager cookieManager = CookieManager.getInstance();
            if (sessionCookie != null) {
                cookieManager.removeSessionCookie();
                String cookieString = sessionCookie.getName()
                        + "=" + sessionCookie.getValue()
                        + "; domain=" + sessionCookie.getDomain();
                cookieManager.setCookie(actionURL, cookieString);
                CookieSyncManager.getInstance().sync();
            }  

            webview.loadDataWithBaseURL(actionURL, htmlString, "text/html", "utf-8", actionURL);}
        }
    }
}

Ich hatte gemischten Erfolg bei der Implementierung dieser Cookie-Lösung. Es scheint für einen Dienst zu funktionieren, bei dem ich mich anmelde und von dem ich weiß, dass er die Cookies auf dem Server hält (alt, veraltet, aber es funktioniert und sie wollen es nicht ändern.) Der Dienst, den ich versuche, muss jetzt vom Benutzer beibehalten werden Cookies auf ihrem lokalen Computer, und es funktioniert nicht mit diesem Setup.

Irgendwelche Vorschläge

Antworten auf die Frage(16)

Ihre Antwort auf die Frage