Задача:
Проблема заключается в том, что, к сожалению, проблема в волейболе. Я имел эту проблему и после долгих поисков я понял, что есть метод, называемый convertHeaders
в BasicNetwork
классе, который обрабатывает заголовки, как это:
protected static Map<String, String> convertHeaders(Header[] headers) {
Map<String, String> result = new TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER);
for (int i = 0; i < headers.length; i++) {
result.put(headers[i].getName(), headers[i].getValue());
}
return result;
}
Вы видите результат Map<String, String>
, который не может содержать одинаковые ключи с различными значениями , поэтому у вас всегда есть только последний cookie.
Стандарт настройки печенья говорит нам, что мы должны отделить печенье с ;
, например, если вы хотите, чтобы содержать 2 ключ-значение в запросе печенья вы должны поставить их так: Cookies: k1=v1;k2=v2
Solution:
В в вашем случае у вас есть два варианта.
1 - изменить свой код в стороне сервера, так что ответ содержит только Set-Cookie
отделенных ключевые ценности, ;
. пример вашего ответа:
Set-Cookie: JESSIONID=qZtQ...;Path=/;HttpOnly;XSRF-TOKEN=6c65...
2 - получить Volley исходный код и изменить этот метод багги и сделать фиксированный .jar снова! эта опция моя любимая причина вы не трогали ответа сервера
Моя реализация этого метода:
protected static Map<String, String> convertHeaders(Header[] headers) {
TreeMap result = new TreeMap(String.CASE_INSENSITIVE_ORDER);
for(int i = 0; i < headers.length; ++i) {
String headerName = headers[i].getName();
if(!result.containsKey(headerName)) {
result.put(headers[i].getName(), headers[i].getValue());
} else {
String value = (String)result.get(headerName);
String mergedValue = value + ";" + headers[i].getValue();
result.remove(headerName);
result.put(headerName, mergedValue);
}
}
return result;
}
Благодаря Sepehr Бехрузи, Google Android разработчик должен позаботиться об этой проблеме. – user2021938