当前位置: 首页 > 知识库问答 >
问题:

如何在Java中缓存httpclient对象?

鄂慈
2023-03-14

在我的客户端webapp中使用Apache HttpClient4.5.x,它连接到(并登录到)另一个(例如主)服务器webapp。

这两个webapp之间的关系是多对多的--这意味着对于客户端webapp中的某个用户的请求,它必须以另一个用户的身份登录+在服务器webapp中进行rest调用。所以我们需要对饼干进行一些分离,这是不可能的(是吗?)要在创建httpclient实例之后获取/设置cookie存储,因此在客户端webapp中接收到的每个请求线程都要做如下操作(并且需要优化):

HttpClient client = HttpClientBuilder.create().setDefaultCookieStore(new BasicCookieStore()).build();
//Now POST to login end point and get back JSESSIONID cookie and then make one REST call, and then the client object goes out of scope when the request ends.

我希望询问缓存httpclient实例对象的最佳实践是什么,它是httpclient实例对象的重量级,如果不是作为一个静态单例对整个客户端webapp重用的话,至少应该对多个请求重用。

具体地说,我希望得到关于这些方法(如果有的话)中哪一种方法是最佳做法的建议:

>

  • 使用静态ConcurrentHashMap为客户端webapp中的每个“用户”缓存httpclient及其关联的basiccookiestore,并仅在包含的缓存cookie接近其到期时间时登录。不确定内存使用情况,并且不使用/很少使用的httpclient会留在内存中而不被驱逐。

    只缓存Cookie(以某种方式),但只要需要将该Cookie用于rest调用,就重新创建一个新的httpclient对象。这将保存先前对登录的调用,直到cookie过期,但不会重用HTPTClient。

    PooledConnectionManager--但不容易找到示例,尽管可能需要设计驱逐策略、最大线程数等(所以可能很复杂)。

    有没有更好的办法呢?多谢了。

    • http://hc.apache.org/httpclient-3.x/performance.html

    通常,建议每个通信组件甚至每个应用程序都有一个HttpClient实例

    • 类似于java httpclient 4.x performance guide以解决问题
  • 共有1个答案

    邴越彬
    2023-03-14

    你为什么要做这些?可以使用本地httpcontext为每个请求分配不同的CookieStore

    如果需要,可以为每个唯一用户维护CookieStore实例的映射。

    CloseableHttpClient httpclient = HttpClients.createDefault();
    CookieStore cookieStore = new BasicCookieStore();
    
    // Create local HTTP context
    HttpClientContext localContext = HttpClientContext.create();
    // Bind custom cookie store to the local context
    localContext.setCookieStore(cookieStore);
    
    HttpGet httpget = new HttpGet("http://httpbin.org/cookies");
    System.out.println("Executing request " + httpget.getRequestLine());
    
    // Pass local context as a parameter
    CloseableHttpResponse response = httpclient.execute(httpget, localContext);
    try {
        System.out.println("----------------------------------------");
        System.out.println(response.getStatusLine());
        List<Cookie> cookies = cookieStore.getCookies();
        for (int i = 0; i < cookies.size(); i++) {
            System.out.println("Local cookie: " + cookies.get(i));
        }
        EntityUtils.consume(response.getEntity());
    } finally {
        response.close();
    }
    
     类似资料:
    • 我有以下代码: 现在我使我的存储库成为反应性的。我的问题是如何使缓存存储现在单声道和通量。 我遇到了以下Mono和Flux缓存,但这只是为了查找,因为我也是反应式编程的初学者。

    • 主要内容:Maven依赖关系,HttpClient缓存示例,以下是纠正/补充内容:HttpClient Cache提供了一个与HTTP / 1.1兼容的缓存层,可以与HttpClient一起使用 - Java相当于浏览器缓存。 以下示例使用HttpClient缓存库的。 Maven依赖关系 我们使用maven来管理依赖关系,并使用Apache HttpClient 4.5版本。 将以下依赖项添加到您的项目中。 pom.xml 文件的内容如下 - HttpClient缓存示例 这

    • 问题内容: 我想将-object 保存到Android存储中的某个位置以快速检索并在其中显示数据。 这可能吗?如果可以,那么SQLite或外部存储适合哪种技术? 问题答案: 例。 并从活动中致电 不要忘记在清单文件中使用write_external_storage权限。

    • 问题内容: 不要说EHCache或OSCache等。出于这个问题的目的,假设我想仅使用SDK实现自己的实现(边做边学)。考虑到缓存将在多线程环境中使用,你将使用哪些数据结构?我已经使用LinkedHashMap和Collections#synchronizedMap实现了一个,但是我很好奇是否有任何新的并发集合会更好。 更新:当我发现这个块时,我只是在阅读Yegge的最新文章: 如果你需要固定时间

    • 问题内容: 因此,当请求该servlet时,我试图获取一个servlet来向用户会话添加Java对象。但是,在servlet重定向到下一页并尝试检索对象之后,我得到了一个对象。 这是将对象添加到HttpSession(在servlet中)的操作: 然后,我尝试通过(在JSP中)检索它: 那么,如何使obj不为null? 更新:我也没有尝试过这个: 在JSP中具有以下内容: 两种方法仍然返回null

    • 问题内容: 从缓存还原后,我需要在磁盘上缓存resp并保持其类型为http.Response。有任何想法吗? 问题答案: 最简单的方法是使用httputil.DumpResponse和http.ReadResponse。 请参阅此处的示例。(您必须将代码复制到本地计算机上并在本地计算机上运行,​​因为Playground不允许I / O) 第一个将接收到的请求转储到内存中的[]字节中,然后可以将其