加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java okHttp重用keep-alive连接

发布时间:2020-12-15 02:10:48 所属栏目:Java 来源:网络整理
导读:如何通过okHttp重用http keep-alive连接? 我的代码示例: public class MainWithOkHttp { static OkHttpClient _client = new OkHttpClient(); public static void main(String[] args) { ... query1(); ... // in this request Request _request = new Req
如何通过okHttp重用http keep-alive连接?

我的代码示例:

public class MainWithOkHttp {

    static OkHttpClient _client = new OkHttpClient();

    public static void main(String[] args) {
        ...
        query1();
        ...
        // in this request
        Request _request = new Request.Builder()
            .url("...")
            .addHeader("connection","keep-alive")
            .addHeader("cookie",_cookie)
            .post(postParams)
            .build();
        // in this request my previous session is closed,why?
        // my previous session = session created in query1 method
        Response _response = _client.newCall(_request).execute();
        ...
    }

    ...
    private static void query1() {
        ...
        Request request = new Request.Builder()
            .url("...")
            .addHeader("connection",_cookie)
            .get()
            .build();
        Response _response = _client.newCall(request).execute();
        ...
    }
    ...

}

所以,我正在调用query1()方法.在此方法中,打开了连接,在服务器端创建了会话,并且收到了带有sessionId的cookie.

但是,当我向服务器执行另一个查询时 – 我之前的连接未被使用,服务器上的会话已经关闭.服务器中的会话生存时间不小,所以问题不在于终身.

PS:我从服务器获取验证码并识别验证码,然后使用验证码对服务器执行查询.但是服务器端的验证码无法识别,因为会话已经关闭,验证码存储在会话中.

解决方法

最终,以下代码对我有用:

public class Main {

  static OkHttpClient _client = new OkHttpClient();

  public static void main(String[] args) throws IOException {
      performQuery();
  }

  private static void performQuery() throws IOException {
      Request firstRequest = new Request.Builder()
            .url("http://localhost/test/index.php")
            .get()
            .build();
      Response firstResponse = _client.newCall(firstRequest).execute();

      Request.Builder requestBuilder = new Request.Builder()
            .url("http://localhost/test/index.php");

      Headers headers = firstResponse.headers();

      requestBuilder = requestBuilder.addHeader("Cookie",headers.get("Set-Cookie"));

      Request secondRequest = requestBuilder.get().build();
      Response secondResponse = _client.newCall(secondRequest).execute();
  }
}

看来,问题出在_cookie对象上.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读