HttpClient4.x 使用cookie保持会话

HttpClient4.x 使用cookie保持会话HttpClient4.x可以自带维持会话功能,只要使用同一个HttpClient且未关闭连接,则可以使用相同会话来访问其他要求登录验证的服务(见TestLogin()方法中的“执行get请求”部分)。如果需要使用HttpClient池,并且想要做到一次登录的会话供多个HttpClient连接使用,就需要自己保存会话信息。因为客户端的会话信息是保存在cookie中的(JSESSIONID),所

大家好,又见面了,我是你们的朋友全栈君。HttpClient4.x可以自带维持会话功能,只要使用同一个HttpClient且未关闭连接,则可以使用相同会话来访问其他要求登录验证的服务(见TestLogin()方法中的“执行get请求”部分)。

如果需要使用HttpClient池,并且想要做到一次登录的会话供多个HttpClient连接使用,就需要自己保存会话信息。因为客户端的会话信息是保存在cookie中的(JSESSIONID),所以只需要将登录成功返回的cookie复制到各个HttpClient使用即可。

使用Cookie的方法有两种,可以自己使用CookieStore来保存(见TestCookieStore()方法),也可以通过HttpClientContext上下文来维持(见TestContext()方法)。

附带HttpClient4.3示例代码 http://www.myexception.cn/program/1459749.html 。

package com.sunbin.httpSession;

import java.io.IOException;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.Iterator;

import java.util.List;

import java.util.Map;

import java.util.Map.Entry;

import org.apache.http.HeaderIterator;

import org.apache.http.HttpEntity;

import org.apache.http.HttpResponse;

import org.apache.http.NameValuePair;

import org.apache.http.ParseException;

import org.apache.http.client.CookieStore;

import org.apache.http.client.config.CookieSpecs;

import org.apache.http.client.entity.UrlEncodedFormEntity;

import org.apache.http.client.methods.HttpGet;

import org.apache.http.client.methods.HttpPost;

import org.apache.http.client.protocol.HttpClientContext;

import org.apache.http.config.Registry;

import org.apache.http.config.RegistryBuilder;

import org.apache.http.cookie.CookieSpecProvider;

import org.apache.http.impl.client.BasicCookieStore;

import org.apache.http.impl.client.CloseableHttpClient;

import org.apache.http.impl.client.HttpClients;

import org.apache.http.impl.cookie.BasicClientCookie;

import org.apache.http.impl.cookie.BestMatchSpecFactory;

import org.apache.http.impl.cookie.BrowserCompatSpecFactory;

import org.apache.http.message.BasicNameValuePair;

import org.apache.http.util.EntityUtils;

import org.junit.Test;

public class TestHttpClient {

  // 创建CookieStore实例

  static CookieStore cookieStore = null;

  static HttpClientContext context = null;

  String loginUrl = “http://127.0.0.1:8080/CwlProClient/j_spring_security_check”;

  String testUrl = “http://127.0.0.1:8080/CwlProClient/account/querySubAccount.action”;

  String loginErrorUrl = “http://127.0.0.1:8080/CwlProClient/login/login.jsp”;

  @Test

  public void testLogin() throws Exception {

    System.out.println(“—-testLogin”);

    // // 创建HttpClientBuilder

    // HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();

    // // HttpClient

    // CloseableHttpClient client = httpClientBuilder.build();

    // 直接创建client

    CloseableHttpClient client = HttpClients.createDefault();

    HttpPost httpPost = new HttpPost(loginUrl);

    Map parameterMap = new HashMap();

    parameterMap.put(“j_username”, “sunb012”);

    parameterMap.put(“j_password”, “sunb012”);

    UrlEncodedFormEntity postEntity = new UrlEncodedFormEntity(

        getParam(parameterMap), “UTF-8”);

    httpPost.setEntity(postEntity);

    System.out.println(“request line:” + httpPost.getRequestLine());

    try {

      // 执行post请求

      HttpResponse httpResponse = client.execute(httpPost);

      String location = httpResponse.getFirstHeader(“Location”)

          .getValue();

      if (location != null && location.startsWith(loginErrorUrl)) {

        System.out.println(“—-loginError”);

      }

      printResponse(httpResponse);

      // 执行get请求

      System.out.println(“—-the same client”);

      HttpGet httpGet = new HttpGet(testUrl);

      System.out.println(“request line:” + httpGet.getRequestLine());

      HttpResponse httpResponse1 = client.execute(httpGet);

      printResponse(httpResponse1);

      // cookie store

      setCookieStore(httpResponse);

      // context

      setContext();

    } catch (IOException e) {

      e.printStackTrace();

    } finally {

      try {

        // 关闭流并释放资源

        client.close();

      } catch (IOException e) {

        e.printStackTrace();

      }

    }

  }

  @Test

  public void testContext() throws Exception {

    System.out.println(“—-testContext”);

    // 使用context方式

    CloseableHttpClient client = HttpClients.createDefault();

    HttpGet httpGet = new HttpGet(testUrl);

    System.out.println(“request line:” + httpGet.getRequestLine());

    try {

      // 执行get请求

      HttpResponse httpResponse = client.execute(httpGet, context);

      System.out.println(“context cookies:”

          + context.getCookieStore().getCookies());

      printResponse(httpResponse);

    } catch (IOException e) {

      e.printStackTrace();

    } finally {

      try {

        // 关闭流并释放资源

        client.close();

      } catch (IOException e) {

        e.printStackTrace();

      }

    }

  }

  @Test

  public void testCookieStore() throws Exception {

    System.out.println(“—-testCookieStore”);

    // 使用cookieStore方式

    CloseableHttpClient client = HttpClients.custom()

        .setDefaultCookieStore(cookieStore).build();

    HttpGet httpGet = new HttpGet(testUrl);

    System.out.println(“request line:” + httpGet.getRequestLine());

    try {

      // 执行get请求

      HttpResponse httpResponse = client.execute(httpGet);

      System.out.println(“cookie store:” + cookieStore.getCookies());

      printResponse(httpResponse);

    } catch (IOException e) {

      e.printStackTrace();

    } finally {

      try {

        // 关闭流并释放资源

        client.close();

      } catch (IOException e) {

        e.printStackTrace();

      }

    }

  }

  public static void printResponse(HttpResponse httpResponse)

      throws ParseException, IOException {

    // 获取响应消息实体

    HttpEntity entity = httpResponse.getEntity();

    // 响应状态

    System.out.println(“status:” + httpResponse.getStatusLine());

    System.out.println(“headers:”);

    HeaderIterator iterator = httpResponse.headerIterator();

    while (iterator.hasNext()) {

      System.out.println(“\t” + iterator.next());

    }

    // 判断响应实体是否为空

    if (entity != null) {

      String responseString = EntityUtils.toString(entity);

      System.out.println(“response length:” + responseString.length());

      System.out.println(“response content:”

          + responseString.replace(“\r\n”, “”));

    }

  }

  public static void setContext() {

    System.out.println(“—-setContext”);

    context = HttpClientContext.create();

    Registry<CookieSpecProvider> registry = RegistryBuilder

        .<CookieSpecProvider> create()

        .register(CookieSpecs.BEST_MATCH, new BestMatchSpecFactory())

        .register(CookieSpecs.BROWSER_COMPATIBILITY,

            new BrowserCompatSpecFactory()).build();

    context.setCookieSpecRegistry(registry);

    context.setCookieStore(cookieStore);

  }

  public static void setCookieStore(HttpResponse httpResponse) {

    System.out.println(“—-setCookieStore”);

    cookieStore = new BasicCookieStore();

    // JSESSIONID

    String setCookie = httpResponse.getFirstHeader(“Set-Cookie”)

        .getValue();

    String JSESSIONID = setCookie.substring(“JSESSIONID=”.length(),

        setCookie.indexOf(“;”));

    System.out.println(“JSESSIONID:” + JSESSIONID);

    // 新建一个Cookie

    BasicClientCookie cookie = new BasicClientCookie(“JSESSIONID”,

        JSESSIONID);

    cookie.setVersion(0);

    cookie.setDomain(“127.0.0.1”);

    cookie.setPath(“/CwlProClient”);

    // cookie.setAttribute(ClientCookie.VERSION_ATTR, “0”);

    // cookie.setAttribute(ClientCookie.DOMAIN_ATTR, “127.0.0.1”);

    // cookie.setAttribute(ClientCookie.PORT_ATTR, “8080”);

    // cookie.setAttribute(ClientCookie.PATH_ATTR, “/CwlProWeb”);

    cookieStore.addCookie(cookie);

  }

  public static List<NameValuePair> getParam(Map parameterMap) {

    List<NameValuePair> param = new ArrayList<NameValuePair>();

    Iterator it = parameterMap.entrySet().iterator();

    while (it.hasNext()) {

      Entry parmEntry = (Entry) it.next();

      param.add(new BasicNameValuePair((String) parmEntry.getKey(),

          (String) parmEntry.getValue()));

    }

    return param;

  }

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/163242.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 二进制的减法

    二进制的减法注:正数的补码是其自身负数的补码是其反码+1这里需要说明的是,在计算机中做二进制数运算时,一定要明确是在多少位的整型前提下进行的,这样才能够正确处理位数溢出的问题。其实减法也可以看成加法6+(-4)无论加减法总结:补码相加结果再求补码1表示负0表示正在计算机中,负数是使用它的补码来表示的。所谓补码,就是反码+1。所谓反码,就是二进制数逐位取反。所谓逐位取反,就是1变成0,0变成1。例如:原来的二进制数:1011011101101反码:01001000100..

    2022年6月18日
    29
  • PR曲线详解

    PR曲线详解目录PR曲线概念precision(精准率)和recall(召回率)PR曲线功能说明PR曲线概念PR曲线中的P代表的是precision(精准率),R代表的是recall(召回率),其代表的是精准率与召回率的关系,一般情况下,将recall设置为横坐标,precision设置为纵坐标。precision(精准率)和recall(召回率)上述中介少了PR曲线的实质代表为precision(精准率)和recall(召回率),但是这二者是什么呢?下面咱们进行相关的讲述。首先,我们了解一下混淆矩阵,如下表

    2022年6月30日
    243
  • Hash Verification哈希值校验工具[通俗易懂]

    Hash Verification哈希值校验工具[通俗易懂]最后更新:2019-2-26HashVerification最新版:HashVerificationV1.0NEW!版本号:V1.0.0.14973大小:21KB/zip格式压缩,63KB/解压后 MD5校验码 SHA1校验码 2ad54536be68bd7446f82da1bd16b113 74610b4cd2fe675d…

    2022年9月13日
    0
  • matlab_dock是什么意思

    matlab_dock是什么意思Mac电脑Dock是什么意思,Dock怎么用?个人总感觉,不能原谅我们自己的惰性!遇到问题自己想办法独立解决,解决不了,可以想办法求助搜索引擎。如果连这也做不到,那实在是无可救药了!下面Mac电脑Dock是什么意思,Dock怎么用的内容,就是笔者,求助搜索引擎,并自己实践的结果,弄清楚之后,还是有一点点成就感的,如果您同意笔者的观点,不妨多抽出点时间,来北海亭逛逛,欢迎您谈谈个人想法!一、Mac电…

    2022年9月12日
    0
  • Ajax 请求的五大步骤

    Ajax 请求的五大步骤什么是AjaxAjax:即异步JavaScript和XML,Ajax是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,Ajax可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新,而传统不使用Ajax的网页,如果需要更新内容,必需重载整个网页面。Ajax的工作原理Ajax的工作原理相当关于在用户和服务器之间加了一个中间层(Ajax引擎),使用户操作与服务器响应异步化,并不是所有的用户请求都提交给服务器。像一些数据验证和数据

    2022年5月17日
    41
  • 为什么优秀的程序猿都阅读源码

    为什么优秀的程序猿都阅读源码

    2022年2月13日
    46

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号