我有一个 http 服务器,它使用会话,但每次我从 okhttp 发送请求时,服务器都会创建一个新会话。
服务器使用jetty和sparkjava。在浏览器中它可以正常工作,并且控制台也确认了这一点。使用 okhttp 它无法正常工作,控制台证实了我对会话的怀疑。 我该如何解决这个问题?
我无法编写一个最小的可重现示例,因为我的项目并不小(<2500 lines) and I think it isn't useful.
如何让 okhttp 通过仅一个会话发送请求?
管理请求和响应cookie不是OkHttp客户端的工作。它无法知道 cookie 策略以及哪些请求属于某个“会话”。但是,它提供了与客户端相关的
CookieJar
接口,可用于根据请求 URL 保存和加载 Cookie
实例。
像这样:
var acceptingCookieJar = new CookieJar() {
ConcurrentHashMap<URI, List<Cookie>> cookieMap = new ConcurrentHashMap<>();
@Override
public List<Cookie> loadForRequest(HttpUrl url) {
return cookieMap.computeIfAbsent(url.uri(), k -> Collections.emptyList());
}
@Override
public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
cookieMap.put(url.uri(), cookies);
}
};
var client = new OkHttpClient.Builder()
.cookieJar(acceptingCookieJar)
.build();
请注意,这只是一个示例。根据您的用例,仅存储请求 URL 的主机部分可能就足够了,或者可能需要跟踪多个会话 ID,例如 JSESSIONID。