简体   繁体   中英

Storing session cookie to maintain log in session

I've been trying to get this work for a while now. Im working on an app where the user signs in with a username and password which uses a httppost request to post to the server. i get the correct response, and during the post i store the session cookie that the server gives me. (I store it in a cookie store) But when i try to click a link on the menu ( which does a second http post) after i logged in, the servers gives me a message saying that i am not logged in. But i send the cookie that i recieved in the first post to the server in the second post, yet the server does not recognize that i am logged in. To test this more easily i used the chrome plug in "Postman" which lets you post to websites easily. The only time it worked was when i log in to the website using chrome then use Postman to do the second post, which successfully gives me a response. however, when i use Postman to log in, then also use postman to attempt the second post , again, "Not logged in". Im guessing that the cookie is not being stored properly in the app. How could i go about fixing this? I read some stuff about storing the cookies in something called "Shared Preferences", is that possibly a fix? If so, what is it and how could i store the cookies there?

     public static String executeHttpPost(String url, ArrayList<NameValuePair> postParameters) throws Exception {
        BufferedReader in = null;
        try {

            LoginLayout.httpClient = new DefaultHttpClient();
            HttpPost request = new HttpPost(url);



            UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(postParameters);
            request.setEntity(formEntity);


           CookieStore cookiestore = LoginLayout.httpClient.getCookieStore();

            HttpResponse response = LoginLayout.httpClient.execute(request);



            List<Cookie> cookies = LoginLayout.httpClient.getCookieStore().getCookies();



           cookiestore.addCookie(cookie);
           cookie = cookies.get(0);
           cookieValue = "ASPSESSIONIDCQTCRACT=" + cookiestore.getCookies();
           System.out.println("The cookie" + cookieValue);
           List<Cookie> cookiess = cookiestore.getCookies();
            cookiee =  cookies.get(0);




            Header[] headers = response.getAllHeaders();
            System.out.println("length" + headers.length);
            for (int i=0; i < headers.length; i++) {

                Header h = headers[i];

                System.out.println( "Header names: "+h.getName());
                System.out.println(  "Header Value: "+h.getValue());
            }



            in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));


            StringBuffer sb = new StringBuffer("");
            String line = "";
            String NL = System.getProperty("line.separator");
            while ((line = in.readLine()) != null) {
                sb.append(line + NL);
            }
            in.close();

           // System.out.println( mCookie);

            String result = sb.toString();
            return result;

        }
        finally {
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }  }

Here is the getter so i can access the cookie from the cookie store in the next activity

        public static String getCookie(){




    return cookiee.getName() +"="+cookiee.getValue();

}

Here is the second post where i try to retrieve the stored cookie, which it seems to do sucessfully, however the server doesnt recognize i am logged in

            public static String executeHttpPost(String url, ArrayList<NameValuePair> postParameters) throws Exception {
      BufferedReader in = null;
      try {




          HttpPost request = new HttpPost(url);


          request.setHeader("Cookie", LoginLayout.getCookie());

          UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(postParameters);
          request.setEntity(formEntity);


          HttpResponse response = LoginLayout.httpClient.execute(request);



          Header[] headers = response.getAllHeaders();
            System.out.println("length" + headers.length);
            for (int i=0; i < headers.length; i++) {

                Header h = headers[i];

                System.out.println( "Header names: "+h.getName());
                System.out.println(  "Header Value: "+h.getValue());
            }

          in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));


          StringBuffer sb = new StringBuffer("");
          String line = "";
          String NL = System.getProperty("line.separator");
          while ((line = in.readLine()) != null) {
              sb.append(line + NL);
          }
          in.close();

          //System.out.println( mCookie);

          String result = sb.toString();
          return result;

      }
      finally {
          if (in != null) {
              try {
                  in.close();
              } catch (IOException e) {
                  e.printStackTrace();
              }
          }
      }
  }

You have to make sure that your HttpClient is using the same HttpContext on each request. The CookieStore is associated with the HttpContext so create a new instance of HttpContext will create a new CookieStore as well.

The best way I found is to create a static instance of HttpContext and use it on every request. Below I added an part of a class I'm using in my apps:

public class ApiClient {

// Constants
private final static String         TAG         = "ApiClient";  
private final static String         API_URL     = "your-url";

// Data
private static ApiClient            mInstance;
private HttpClient                  mHttpClient;
private ThreadSafeClientConnManager mConnectionManager;
private HttpPost                    mPost;


/*
 * we need it static because otherwise it will be recreated and the session
 * will be lost
 */
private static HttpContext          mHttpContext;
private HttpParams                  mParams;    
private Context                     mContext;

public ApiClient(Context pContext) {
    mParams = new BasicHttpParams();
    mContext = pContext;

    if (null == mHttpContext) {
        CookieStore cookieStore = new BasicCookieStore();
        mHttpContext = new BasicHttpContext();
        mHttpContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
    }

    ConnManagerParams.setMaxTotalConnections(mParams, 300);
    HttpProtocolParams.setVersion(mParams, HttpVersion.HTTP_1_1);

    SchemeRegistry schemeRegistry = new SchemeRegistry();
    schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));

    mConnectionManager = new ThreadSafeClientConnManager(mParams, schemeRegistry);
    mHttpClient = new DefaultHttpClient(mConnectionManager, mParams);
}

public static ApiClient getInstance(Context pContext) {
    if (null == mInstance) {
        return (mInstance = new ApiClient(pContext));
    } else {
        return mInstance;
    }
}

public void testPOST() {
    List<NameValuePair> requestParams = new ArrayList<NameValuePair>();
    requestParams.add(new BasicNameValuePair("param1", "value1"));
    requestParams.add(new BasicNameValuePair("param2", "value2"));

    mPost = new HttpPost(API_URL);
    try {
        mPost.setEntity(new UrlEncodedFormEntity(requestParams, HTTP.UTF_8));
        HttpResponse responsePOST = mHttpClient.execute(mPost, mHttpContext);
        HttpEntity resEntity = responsePOST.getEntity();
        String result = EntityUtils.toString(resEntity);

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

}

To test it try setting the correct API_URL and

ApiClient api = ApiClient.getInstance(somContext);
api.testPOST();

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM