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)
上一篇 2022年7月22日 上午8:16
下一篇 2022年7月22日 上午8:16


相关推荐

  • Cursor全栈开发环境配置攻略(Win版):Python/JS/Node.js/Java搭建

    Cursor全栈开发环境配置攻略(Win版):Python/JS/Node.js/Java搭建

    2026年3月16日
    2
  • sap安装配置_sapgui730安装指南

    sap安装配置_sapgui730安装指南一.下载和安装    WEBIDE是免安装的,下载完解压就行。       下载地址  Developerguid在线文档  在线文档打开会比较慢,可以下载下来观看。二.配置ABAP链接 在IDE的解压文件的配置文件夹中新建文件ER1(没有后缀名)  编辑新建文件添加如下内容:  Description=

    2022年10月18日
    6
  • 关于裴蜀定理的一些证明

    关于裴蜀定理的一些证明裴蜀定理 对任何 a b Za b inZ 和它们的最大公约数 dd 关于未知数 xx 和 yy 的线性不定方程 称为裴蜀等式 ax by cax by c 有整数解 x y x y 当且仅当 d cd midc 可知有无穷多解 特别地 一定存在整数 x yx y 使 ax by dax by d 成立 推论 a ba b 互质的充要条件是存在整数 x yx y 使 ax by 1ax by 1 对于 a b

    2026年3月18日
    1
  • 内网ip和外网ip区别

    内网ip和外网ip区别文章一:原文:https://blog.csdn.net/Alexwym/article/details/81772446我们每天都会访问各种各样的网站,比如淘宝,百度等等。不免会思考,我们的设备是如何连接上这些网址的呢?要想搞清楚这个问题,首先就得先搞清楚内网ip和外网ip的联系。如图,假设我们的计算机现在就是设备一,我们想要访问百度。如果我们正使用着校园网,那么首先我们需要先通…

    2022年6月14日
    40
  • 国二C语言:VC++2010学习版「建议收藏」

    国二C语言:VC++2010学习版「建议收藏」全国计算机等级考试二级C语言程序设计考试大纲(2019年版)指出:开发环境:MicrosoftVisualC++2010学习版。也就是说,不管你在学习过程中用的是什么样的开发环境…

    2022年4月20日
    341
  • simulink中积分环节、惯性环节、比例环节

    simulink中积分环节、惯性环节、比例环节simulink中积分环节、惯性环节、比例环节的搭建

    2026年4月17日
    5

发表回复

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

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