【问题标题】:CookieManager not sending cookie after first and second requestCookieManager 在第一次和第二次请求后不发送 cookie
【发布时间】:2015-11-06 23:13:57
【问题描述】:

目前正在使用 CookieManager 开发 Android 应用程序..

我正在尝试使用 for 循环执行 PUT 请求,但由于某些奇怪的原因,只有前两个请求成功。我向服务器人员寻求帮助,他表示其他 PUT 请求失败,因为它们没有附加 cookie。

这是我正在使用的 for 循环。

for(int i = 0; i < userList.size(); i++) {

        User user = userList.get(i);

        String url = apiURL;
        String address = user.getEmail() == null ? "nil":user.getEmail();

        String jsonString = "{build:\"" + String.valueOf(BuildConfig.VERSION_CODE) + "\",device_id:\"" + ((MainActivity)activity).tmDevice + "\",platform:\"android\",\n" +
                "                     type:\"User\",\n" +
                "                       id:\"" + String.valueOf(user.getId()) + "\",\n" +
                "               first_name:\"" + user.getFirstName() + "\",\n" +
                "                last_name:\"" + user.getLastName() + "\",\n" +
                "                     name:\"" + user.getName() + "\",\n" +
                "                    image:{\n" +
                "                type:\"UserPhoto\",\n" +
                "                  id:\"1a035500-012f-1cc2-9d22-96a73beda35e\"\n" +
                "            },\n" +
                "                   emails:[\n" +
                "                 {\n" +
                "                       type:\"Email\",\n" +
                "                    address:" + address + "\n" +
                "                }\n" +
                "            ],\n" +
                "            phone_numbers:[]\n" +
                "        }";

        JSONObject js = null;
        try {
            js = new JSONObject(jsonString);
        } catch (JSONException e) {
            e.printStackTrace();
        }

        final JSONObject finalJs = js;
        JsonObjectRequest jsObjRequest = new JsonObjectRequest(
                Request.Method.PUT,url, finalJs,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {
                        Log.i("putresponse", String.valueOf(response));
                    }
                }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {
                Log.i("puterror", String.valueOf(error));
            }

        });
        VolleySingleton.getInstance((MainActivity) activity).addToRequestQueue(jsObjRequest);

 }

这是设置CookieManager的代码。

manager = new CookieManager();
CookieHandler.setDefault(manager);

即使在 PUT 请求之前的 GET 请求也可以正常工作.. 有什么帮助吗?

【问题讨论】:

    标签: android cookies server android-volley cookiemanager


    【解决方案1】:

    经过 3 天的关于 CookieManager 的搜索和阅读

    我终于找到并做出了完美的解决方案:

    static CookieManager myCookies = new CookieManager(null, CookiePolicy.ACCEPT_ALL);;
    
    final public static void saveCookies(HttpURLConnection connection , Context context) {
        Map<String, List<String>> headerFields = connection.getHeaderFields();
    
        List<String> cookiesHeader = null;
        try {
            cookiesHeader = headerFields.get("Set-Cookie");
        } catch (Exception e) {
            e.printStackTrace();
        }
    
        if (cookiesHeader != null && myCookies != null) {
            for (String cookie : cookiesHeader) {
                try {
                    cookie = cookie.replace("\"", "");
                    myCookies.getCookieStore().add(connection.getURL().toURI(), HttpCookie.parse(cookie).get(0));
                    String new_cookie = TextUtils.join(";", myCookies.getCookieStore().getCookies());
    
                    PreferenceManager.getDefaultSharedPreferences(context).edit().putString("cookie", new_cookie).commit();
    
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        }
    }
    
    final public static void loadCookies(HttpURLConnection connection , Context context) {
        if (myCookies != null && myCookies.getCookieStore().getCookies().size() > 0) {
            connection.setRequestProperty("Cookie", TextUtils.join(";", myCookies.getCookieStore().getCookies()));
        }
        else {
            String new_cookie = PreferenceManager.getDefaultSharedPreferences(context).getString("cookie" , "");
            connection.setRequestProperty("Cookie", new_cookie );
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-14
      • 1970-01-01
      • 1970-01-01
      • 2011-07-14
      • 2015-10-05
      • 2019-08-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多