问题:
不幸的是,问题出在 Volley 内部。我遇到了这个问题,经过多次搜索,我发现BasicNetwork 类中有一个名为convertHeaders 的方法可以处理这样的标题:
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 设置的标准告诉我们应该用 ; 分隔 cookie,例如,如果你想在请求 cookie 中包含 2 个键值,你应该像这样放置它们:
Cookies: k1=v1;k2=v2
解决方案:
在您的情况下,您有两个选择。
1 - 在服务器端更改您的代码,以便响应仅包含 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;
}