【问题标题】:HttpPost cookies persisting androidHttpPost cookie 持久化 android
【发布时间】:2012-08-09 22:00:51
【问题描述】:

我想在发布请求后保存 cookie。 httpClient实现类:

 public class JSONParser {
    CookieStore store = new BasicCookieStore();
       static InputStream is = null;
        static JSONObject jObj = null;
        static String json = "";
        private static final DefaultHttpClient httpClient = new DefaultHttpClient() ;
     public static DefaultHttpClient getInstance() { return httpClient; }

    public JSONObject getJSONFromUrl(String url, List<NameValuePair> params) {

        // Making HTTP request
        try {
            CookieStore cookieStore = new BasicCookieStore();

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

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

            DefaultHttpClient httpClient = JSONParser.getInstance();
            List<Cookie> cookies = httpClient.getCookieStore().getCookies();
            httpClient.getParams().setParameter(CoreProtocolPNames.USER_AGENT, "Android-AEApp,ID=2435743");
            httpClient.getParams().setParameter(ClientPNames.COOKIE_POLICY, CookiePolicy.RFC_2109);
            HttpPost httpPost = new HttpPost(url);
            httpPost.setEntity(new UrlEncodedFormEntity(params));
            httpPost.setHeader("User-Agent","Android-AEApp,ID=2435743");

            cookies = httpClient.getCookieStore().getCookies();
            httpPost.setHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
            httpPost.setHeader("Cookie", "PHPSESSID=lc89a2uu0rj6t2p219gc2cq4i2; path=/");
            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            cookies = httpClient.getCookieStore().getCookies();

            if (cookies.isEmpty()) {
                for (Cookie a : cookies)
                cookieStore.addCookie(a);
            } else {
                for (Cookie a : cookies) {
                    cookieStore.addCookie(a);
                    System.out.println("- " + a.getValue().toString());
                }
            }

            is = httpEntity.getContent();


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

我为我的 DefaultHttpClient 创建了单音,并希望将其用于进一步的请求。当我尝试这样做时:

 HttpResponse httpResponse = httpClient.execute(httpPost, localContext);

我没有饼干。当我不包含 localContext 时,我可以使用

获取 cookie
 if (cookies.isEmpty()) {
                for (Cookie a : cookies)
                cookieStore.addCookie(a);
            } else {
                for (Cookie a : cookies) {
                    cookieStore.addCookie(a);
                    System.out.println("- " + a.getValue().toString());
                }
            }

但 cookie 不会在第二次请求时设置。我猜 - 原因是没有使用 localContext。告诉我有什么问题,如果 cookie 一直在变化,我该如何设置?

【问题讨论】:

    标签: android http-post httpclient cookiestore


    【解决方案1】:

    我将 Singletone 用于我的 Cookie 的 ArrayList。它看起来像这样:

    public class CookieStorage {
    
    
        private ArrayList<Object> arrayList;
    
        private static CookieStorage instance;
    
        private CookieStorage(){
            arrayList = new ArrayList<Object>();
        }
    
        public static CookieStorage getInstance(){
            if (instance == null){
                instance = new CookieStorage();
            }
            return instance;
        }
    
        public ArrayList<Object> getArrayList() {
            return arrayList;
        }
    
        @Override
        public String toString()
        {       
        return getArrayList().toString();   
        }
    }
    

    还有我的 HttpClient 类:

    public class HttpClient {
    static InputStream is = null;
    private static final DefaultHttpClient httpClient = new DefaultHttpClient() ;
    public static DefaultHttpClient getInstance() { return httpClient; }
    
     public static InputStream getResponse(String url, List<NameValuePair> params)
     {
        try {
        CookieStore cookieStore = new BasicCookieStore();
        DefaultHttpClient httpClient = JSONParser.getInstance();        
        httpClient.getParams().setParameter(CoreProtocolPNames.USER_AGENT, "Android-AEApp,ID=2435743");
        httpClient.getParams().setParameter(ClientPNames.COOKIE_POLICY, CookiePolicy.RFC_2109);
        BasicClientCookie cookie = new BasicClientCookie("PHPSESSID", "1");  
        httpClient.setCookieStore(cookieStore);
        HttpPost httpPost = new HttpPost(url);
        httpPost.setEntity(new UrlEncodedFormEntity(params));
        httpPost.setHeader("User-Agent","Android-AEApp,ID=2435743");
        httpPost.setHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
        System.out.println(CookieStorage.getInstance().toString());
        if (CookieStorage.getInstance().getArrayList().isEmpty())
            CookieStorage.getInstance().getArrayList().add("PHPSESSID=lc89a2uu0rj6t2p219gc2cq4i2");
        httpPost.setHeader("Cookie", CookieStorage.getInstance().getArrayList().get(0).toString());
        HttpResponse httpResponse = httpClient.execute(httpPost);
        Header[] head = httpResponse.getAllHeaders();
        System.out.println(cookie);
    
        if (httpResponse.getLastHeader("Set-Cookie")!=null)
        {
    
            CookieStorage.getInstance().getArrayList().remove(0);
            CookieStorage.getInstance().getArrayList().add(httpResponse.getLastHeader("Set-Cookie").getValue());
        }
        Log.i("arrayList",(CookieStorage.getInstance().getArrayList().toString()));
    
        HttpEntity httpEntity = httpResponse.getEntity();
        is = httpEntity.getContent();
    
    
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    
         return is;
     }
    
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-24
      • 2011-02-20
      • 1970-01-01
      • 1970-01-01
      • 2013-05-14
      • 2017-04-29
      • 2015-09-14
      • 1970-01-01
      相关资源
      最近更新 更多