Android - remote login succeeds, but login state is not saved

I have an Android app that fetches data from a remote server including authentication. The remote server is using Yii. Our iPhone version uses a remote web service and there is no problem. But with our Android: 1) we can login, the server returns 200; 2), but on the next page, when we try to call another api for the db request, it keeps returning an error that the user is not logged in.

What I did: 1. Check the user session on the back panel. Yes, after logging in from android, the user's sessions become active. 2. Use the same API call with POSTER Firefox. Yes, it can fetch data.

What could have gone wrong? Can someone help? Many thanks!

Here's my login code:

package ...
import ...

public class Login extends Activity implements OnClickListener {

    EditText etUser, etPass;
    Button bLogin, btnCancel;

    //Create string variables that will have the input assigned to them
    String username, password;

    //Create a HTTPClient as the form container
    HttpClient httpclient;

    //Use HTTP POST method
    HttpPost httppost;

    //Create an array list for the input data to be sent
    ArrayList<NameValuePair> nameValuePairs;

    //Create a HTTP Response and HTTP Entity
    HttpResponse response;
    org.apache.http.HttpEntity entity;
//    protected static final String TAG = MainActivity.class.getSimpleName();
    final String url = "..remote api...";
 // JSON Node names
     private static final String TAG_CONTACTS = "users";
     // contacts JSONArray
     JSONArray contacts = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {

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

        initialise();

    }



    private void initialise() {
        etUser = (EditText) findViewById(R.id.txtUname);
        etPass = (EditText) findViewById(R.id.txtPwd);
        bLogin = (Button) findViewById(R.id.sumit_login);
        btnCancel = (Button) findViewById(R.id.btn_Cancel);
        //Now to set an onClickListener

        bLogin.setOnClickListener(this);

        btnCancel.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View arg0) {
                Intent intent = new Intent(getApplicationContext(), MainActivity.class);
                startActivity(intent);  
            }
        });
    }

    public void onClick(View v)  {
        // This is where we will be working now
        if (etUser.getText().toString().length() == 0
                || etPass.getText().toString().length() == 0) {
            Toast.makeText(getApplicationContext(),
                    "Please enter username and password",
                    Toast.LENGTH_SHORT).show();
        } else {
            new MyAsyncTask().execute();
        }

    }//END onClick()

    private static String convertStreamToString(InputStream is) {
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        StringBuilder sb = new StringBuilder();

        String line = null;
        try {
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return sb.toString();
    }//END convertStreamToString()



    private class MyAsyncTask extends AsyncTask<Void, Void, Integer>
    {
        ProgressDialog mProgressDialog;


        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            mProgressDialog = new ProgressDialog(Login.this);
            mProgressDialog.setMessage("Authenticating...");
            mProgressDialog.setIndeterminate(false);
            mProgressDialog.setCancelable(false);
            mProgressDialog.show();
        }

        @Override
        protected Integer doInBackground(Void... params) {

            int repsonStatus = 0;
            //Create new default HTTPClient
            httpclient = new DefaultHttpClient();

            //Create new HTTP POST with URL to php file as parameter
            httppost = new HttpPost("... login api ..."); 

            //Assign input text to strings
            username = etUser.getText().toString();
            password = etPass.getText().toString();

            JSONParser jParser = new JSONParser();
            //Next block of code needs to be surrounded by try/catch block for it to work
            try {
                //Create new Array List
//                nameValuePairs = new ArrayList<NameValuePair>(2);
                List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
                //place them in an array list
                nameValuePairs.add(new BasicNameValuePair("login", "login"));
                nameValuePairs.add(new BasicNameValuePair("username", username));
                nameValuePairs.add(new BasicNameValuePair("password", password));
                nameValuePairs.add(new BasicNameValuePair("api_key", "service_api"));


                //Add array list to http post
                httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

                //assign executed form container to response
                response = httpclient.execute(httppost); //response from the PHP file

                Log.i("AirconServer -- header login", response.getAllHeaders().toString());
                Log.i("postData", response.getStatusLine().toString());
                HttpEntity entity_ = response.getEntity();

                repsonStatus = response.getStatusLine().getStatusCode();
                if(response.getStatusLine().getStatusCode() == 200){
                    Log.i("AirconService - ", "LOGIN SUCCESSFUL!");


                    }
                } else {
                    Toast.makeText(getApplicationContext(),
                            "Invalid Username or password.",
                            Toast.LENGTH_SHORT).show();
                }


            } catch(Exception e){

                e.printStackTrace();
            }

            return repsonStatus;
        }
        @Override

        protected void onPostExecute(Integer result) {
            mProgressDialog.dismiss();
            if(result == 200) {
                Intent intent = new Intent(getApplicationContext(), MainMenuActivity.class);
                startActivity(intent);
            } else {
                Toast.makeText(getApplicationContext(),
                        "Invalid Username or password.",
                        Toast.LENGTH_SHORT).show();
            }         
        }
    }

}

      

Here's the code for another call that still prompts for login while the user is already logged in.

public class GetMybookings extends ListActivity {

    int TIMEOUT_MILLISEC = 10000;
    ArrayList<jobs> bookings = new ArrayList<jobs>();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
    @Override
    public void onStart() {
        super.onStart();

        final Calendar c = Calendar.getInstance();
        int mYear = c.get(Calendar.YEAR);
        final String url = "... api ...";
        new MybookingTask().execute(url);
    }

    @Override
    protected void onListItemClick(android.widget.ListView l, android.view.View v, int position, long id) {
        if (this.bookings == null) {
            return;
        }
        startActivity(new Intent(Intent.ACTION_VIEW));
    }
    private void refreshResults(ArrayList<jobs> books) {

        setListAdapter(new Mybookings(this,books));
    }

    private class MybookingTask extends AsyncTask<String, Void, ArrayList<jobs>> {

            ProgressDialog mProgressDialog;


                    @Override
        protected void onPreExecute() {
                        super.onPreExecute();
                        mProgressDialog = new ProgressDialog(GetMybookings.this);
                        mProgressDialog.setMessage("Loading Bookings...");
                        mProgressDialog.setIndeterminate(false);
                        mProgressDialog.setCancelable(false);
                        mProgressDialog.show();
        }
        protected ArrayList<jobs> doInBackground(String... urls) {
            try {
                HttpParams httpParams = new BasicHttpParams();
                HttpConnectionParams.setConnectionTimeout(httpParams, TIMEOUT_MILLISEC);
                HttpConnectionParams.setSoTimeout(httpParams, TIMEOUT_MILLISEC);

                HttpClient httpClient = new DefaultHttpClient();
                HttpGet httpGet = new HttpGet(urls[0]);
                HttpResponse response = null;

                try {

                    ResponseHandler<String> responseHandler = new BasicResponseHandler();
                    String responseBody = httpClient.execute(httpGet, responseHandler);

                    response = httpClient.execute(httpGet);
                    Log.i("AirconService GetMyBookings -- header login", response.getAllHeaders().toString());
                    Log.i("postData", response.getStatusLine().toString());
                    Log.i("AirconService GetMyBookings -- response data", response.getEntity().toString());
                    Log.i("AirconService GetMyBookings-- response data", response.toString());

                    HttpEntity entity = response.getEntity();
                    String responseString = new String();
                    if(entity != null) {
                        responseString = EntityUtils.toString(entity);
                        Log.i("WHAT???", "??? responseString is: " + responseString);
                    }



                } catch(ClientProtocolException e) {
                    e.printStackTrace();


            } catch(Throwable t) {
                t.printStackTrace();
            }

            return null;
        }
        protected void onPostExecute(ArrayList<jobs> result) {
            mProgressDialog.dismiss();
            refreshResults(result);
        }
    }
}

      

UPDATED

I tried Anand's solution: IT WORK !!!

Common.java:

import ...

public class Common {
    public static CookieStore cookieStore = new BasicCookieStore();
}

      

Login code:

public class Login extends Activity implements OnClickListener {

static HttpContext localContext = new BasicHttpContext();

      

...

   protected Integer doInBackground(Void... params) {
        localContext.setAttribute(ClientContext.COOKIE_STORE, Common.cookieStore);
        //Create new default HTTPClient
        httpclient = new DefaultHttpClient();

        //Create new HTTP POST with URL to php file as parameter
        httppost = new HttpPost(... api ...); 

      

Second call after login (in a separate class):

public class GetMybookings extends ListActivity {

    static HttpContext localContext = new BasicHttpContext();
        ....
        protected ArrayList<jobs> doInBackground(String... urls) {
            try {
                HttpClient httpClient = new DefaultHttpClient();
                HttpGet httpGet = new HttpGet(... api ....);
                HttpResponse response = null;

                try {
                    localContext.setAttribute(ClientContext.COOKIE_STORE, Common.cookieStore);
                    response = httpClient.execute(httpGet, localContext);

      

+3


source to share


1 answer


Try it, it works for me:

// Create a local instance of cookie store

public static CookieStore cookieStore = new BasicCookieStore();

// Create local HTTP context

static HttpContext localContext = new BasicHttpContext();

 // Bind custom cookie store to the local context

localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);

// Pass local context as a parameter
HttpResponse  httpResponse = client.execute(request, localContext);

List<Cookie> cookies = cookieStore.getCookies();
for (int i = 0; i < cookies.size(); i++) {
    MLog.d("LOCAL COOKIES: ", ""+ cookies.get(i));
}

HttpEntity entity = httpResponse.getEntity();

      



try using this method:

 // Create a local instance of cookie store
public static CookieStore cookieStore = new BasicCookieStore();

// Create local HTTP context
static HttpContext localContext = new BasicHttpContext();





private synchronized void executeRequest(String  url) {

        HttpPost request = new HttpPost(url);

        List<NameValuePair> params = new ArrayList<NameValuePair>();
             //place them in an array list
        params.add(new BasicNameValuePair("login", "login"));
        params.add(new BasicNameValuePair("username", username));
        params.add(new BasicNameValuePair("password", password));
        params.add(new BasicNameValuePair("api_key", "service_api"));

        request.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));

        HttpClient client = new DefaultHttpClient();

        HttpResponse httpResponse;

        // Bind custom cookie store to the local context
        localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);

        try{
        // Pass local context as a parameter
        httpResponse = client.execute(request, localContext);

        List<Cookie> cookies = cookieStore.getCookies();
        for (int i = 0; i < cookies.size(); i++) {
            Log.d("LOCAL COOKIES: ", ""+ cookies.get(i));
        }

        HttpEntity entity = httpResponse.getEntity();

        if (entity != null) {

            InputStream instream = entity.getContent();
            String res = convertStreamToString(instream);

            instream.close();
        }
        } catch (Exception e) {

            client.getConnectionManager().shutdown();
            e.printStackTrace();


        }      
 }  

      

+1


source







All Articles