Maintain cookie session in Android

Posted by datguywhowanders on Stack Overflow See other posts from Stack Overflow or by datguywhowanders
Published on 2010-06-14T16:49:23Z Indexed on 2010/06/14 16:52 UTC
Read the original article Hit count: 1368

Filed under:
|
|
|
|

Okay, I have an android application that has a form in it, two EditText, a spinner, and a login button. The user selects the service from the spinner, types in their user name and password, and clicks login. The data is sent via POST, a response is returned, it's handled, a new webview is launched, the html string generated form the response is loaded, and I have the home page of whatever service the user selected.

That's all well and good. Now, when the user clicks on a link, the login info can't be found, and the page asks the user to login again. My login session is being dropped somewhere, and I'm not certain how to pass the info from the class that controls the main part of my app to the class that just launches the webview activity.

The on click handler from the form login button:

 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, user)); 
        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 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);
    }
}

And here is the webview class that handles the response display:

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

} }

I've had mixed success implementing that cookie solution. It seems to work for one service I log into that I know keeps the cookies on the server (old, archaic, but it works and they don't want to change it.) The service I'm attempting now requires the user to keep cookies on their local machine, and it does not work with this setup.

Any suggestions?

© Stack Overflow or respective owner

Related posts about android

Related posts about session