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

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;
    }

猜你喜欢

转载自blog.csdn.net/blueboz/article/details/82558871