HttpClient 4.x 学习笔记:Cookie自动保存,登录状态保持,会话保持

news/2024/5/18 13:43:02 标签: httpClient, Java, Cookie, Http, 设计模式

HttpClient 4.x 有这个功能,就是Cookie 维持功能。意思是说,通过如下代码创建了一个HttpClient ,如果不关闭这个HttpClient 的话,那么他的请求会自动解析上一个请求的Set-Cookie,并且将其存储到CookieStore 里面。

private CookieStore cookieStore;
private HttpClient httpClient;
private void init() {
    //使用自己的cookieStore的原因是,可以查看cookie 中的内容。
    cookieStore = new BasicCookieStore();
    // 只有使用一个httpClient 才能实现会话维持的效果
    httpClient = HttpClients.custom()
                            .setDefaultCookieStore(cookieStore)
                            .build();
}

这样,在每一个请求之前,我们可以通过打印这个cookieStore里面的cookie ,观察其是否已经为我们默认的保留了Cookie

可以使用如下代码进行查询Cookie


List<Cookie> cookies = cookieStore.getCookies();
cookies.stream().forEach(k -> {
    System.out.println(k.getName() + ":" + k.getValue());
});

需要注意的是,HttpClient 官方提醒,存储于cookieStore 中的cookie可能会在GC发生之后丢失,所以,必要的情况下,需要做好Cookie的备份工作,以免连接丢失。

HttpClient 简单示例代码
使用如下代码需要注意高并发问题。因为单汉式懒加载初始化,没有加锁,会导致多次初始化的问题。修复代码参考最后。

public class HttpRequester {

    private static HttpRequester requester;

    private CookieStore cookieStore;

    private HttpClient httpClient;

    private HttpRequester() {
        cookieStore = new BasicCookieStore();
        httpClient = HttpClients.custom().setDefaultCookieStore(cookieStore).build();
    }

    public static HttpRequester getInstance() {
        if (requester == null)
            requester = new HttpRequester();
        return requester;
    }

    public String getRequest(String url) {
        return getRequest(url, "UTF-8");
    }

    public String getRequest(String url, String encode) {
        URI uri = URI.create(url);
        HttpGet request = new HttpGet(uri);
        try {
            HttpResponse response = httpClient.execute(request);
            List<Cookie> cookies = cookieStore.getCookies();
            cookies.stream().forEach(k -> {
                System.out.println(k.getName() + ":" + k.getValue());
            });
            HttpEntity entity = response.getEntity();
            InputStream content = entity.getContent();
            String str = new String(content.readAllBytes(), encode);
            return str;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    public void closeHttpClient() {
        try {
            ((CloseableHttpClient) httpClient).close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

避免多线程出现的问题

    /**
     * 采用的是饿汉式 没有做好线程同步,可能会导致问题
     */
    public static HttpRequester getInstance() {
        if (requester == null) {
            synchronized (HttpRequester.class) {
                if (requester == null) {
                    requester = new HttpRequester();
                }
            }
        }
        return requester;
    }

http://www.niftyadmin.cn/n/892074.html

相关文章

Gradle 错误:Eclipse环境下gradle报错Could not target platform: 'Java SE 10' using tool chain: 'JDK 8 (1.8)'.

问题简述 当使用gradle 的时候&#xff0c;在build.gradle 文件中&#xff0c;通过如下脚本指定代码的版本。 project.sourceCompatibility1.10 project.targetCompatibility1.10这个问题其实已经很明显&#xff0c;gradle 是依赖groovy ,groovy又是依赖jdk 的&#xff0c;明…

Oracle: 环境变量相关总结,Toad关于OCI的配置,PLSQL等配置

环境变量快速示例 在环境变量中&#xff0c;有效的环境变量有如下 ORACLE_HOMEORACLE_SIDSQLPATHTNS_ADMINNLS_LANG 其中ORACLE_HOME环境变量允许指向多个instant-client ,需要注意的是&#xff0c;对于plsql来说&#xff0c;建议是指定一个比较好&#xff0c;因为如果指定了…

Docker 笔记: 常见配置速查,深入版

修改Docker-machine默认存储位置 我们在创建虚拟机 的时候&#xff0c;加上这一段就好,如下黑体字 docker-machine -s“E:\DockerMachine” create --engine-reg istry-mirrorhttps://dq2jkweq.mirror.aliyuncs.com -d virtualbox default -s 参数表示的是Docker虚拟机存储的目…

Jdk11 HttpClient 关于会话维持Cookie

Jdk 中的HttpClient比较好用&#xff0c;默认情况下&#xff0c;是不会为我们维持Cookie&#xff0c;我们需要通过下面的方法实现 参考官方的文档说明。并参照如下代码 https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/net/CookieHandler.html public stat…

Docker:docker-toolbox的一些配置,boot2docker的部分说明

docker-toolbox docker-toolbox 是为windows上进行虚拟化Dockers环境的一个容器。 其实质上是通过virtualBox虚拟机进行虚拟出的系统。在windows环境下,可以通过docker-machine命令来创建虚拟机(容器)。 在使用docker-machine创建虚拟机的时候,有多种命令供使用。 Usage…

Linux笔记:常用功能集锦

网络的配置 Linux 上对网卡的配置&#xff0c;是在 /etc/sysconfig/network-scripts/ifcfg-ensxx 类似这样的文件&#xff0c;每一个文件对应一个网卡 里面配置了这个网卡的地址信息&#xff0c;DNS信息&#xff0c;以及获取IP 地址的方式&#xff0c;是Dhcp还是static方式等等…

Spring Data:JPA基础配置

一般的JPA项目&#xff0c;要求在META-INF目录下对JPA的基础配置信息做配置。主要在persistence.xml文件中进行配置&#xff0c;主要配置有dataSource ,jpa提供的厂商类HibernatePersistenceProvider,以及一些Hibernate的参数&#xff0c;如showsql,ddl自动生成等。 参考如下博…

Windows Dockers环境下,让windows与Dockers互通解决方案,iptables解决方案过程原理了解

看图解说 要做到网络互通&#xff0c;首先你必须对整个网络拓扑结构有了解。笔者为你们画了出来了。基本结构就是这样。 首先必须强调的概念是。这些网络当中&#xff0c; 要让我们的dockerMachine帮我们转发请求&#xff0c;必须在docker-machine 上面最端口转化&#xff0c;…