存储会话cookie以维护登录会话

时间:2014-08-13 06:07:19

标签: java android cookies http-post session-cookies

我一直试图让这项工作暂时搁置一段时间。我在一个应用程序上工作,用户使用用户名和密码登录,该用户名和密码使用httppost请求发布到服务器。我得到了正确的答案,在帖子中我存储了服务器给我的会话cookie。 (我把它存放在一个cookie商店) 但是当我在登录后尝试单击菜单上的链接(执行第二个http帖子)时,服务器会给我一条消息,说我没有登录。但是我发送了第一篇文章中收到的cookie到第二篇文章中的服务器,但服务器无法识别我已登录。为了更容易地测试这个我使用“邮差”中的chrome插件,它可以让你轻松地发布到网站。它唯一有效的时间是我使用chrome登录网站,然后使用Postman做第二篇文章,成功地给了我一个回复。但是,当我使用Postman登录时,还要使用邮递员再次尝试第二篇文章“未登录”。我猜测cookie没有正确存储在应用程序中。我怎么能解决这个问题呢?我读了一些关于将cookie存储在“共享首选项”中的东西,这可能是一个修复方法吗?如果是这样,它是什么以及如何将饼干存储在那里?

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

这是getter,所以我可以在下一个活动中从cookie商店访问cookie

        public static String getCookie(){




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

}

这是第二篇文章,我试图检索存储的cookie,它似乎成功,但服务器无法识别我已登录

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

1 个答案:

答案 0 :(得分:0)

您必须确保您的HttpClient在每个请求上使用相同的HttpContext。 CookieStore与HttpContext相关联,因此创建一个新的HttpContext实例也将创建一个新的CookieStore。

我找到的最好的方法是创建一个HttpContext的静态实例,并在每个请求中使用它。 下面我添加了我在我的应用程序中使用的类的一部分:

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

}

要测试它,请尝试设置正确的API_URL和

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