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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 国际邮箱:7个国外电子邮箱

    国际邮箱:7个国外电子邮箱国际邮箱:7个国外电子邮箱
    Gmail是由谷歌开发的免费电子邮箱服务。Gmail可以自动识别垃圾邮件,并自动将其重定向到垃圾邮件文件夹,30天后,将永久删除它们。邮件翻译器是Gmail最独特的功能之一

    2022年7月4日
    143
  • Python的八种数据类型[通俗易懂]

    Python的八种数据类型[通俗易懂]Python的八种数据类型八种数据类型分别是:number(数字)、string(字符串)、Boolean(布尔值)、None(空值)list(列表)、tuple(元组)、dict(字典)、se

    2022年7月5日
    26
  • 网络模拟发包工具_移动端抓包工具

    网络模拟发包工具_移动端抓包工具原文:https://zm8.sm-tc.cn/?src=l4uLj8XQ0IuekZWWi5bRk5CZi5qN0ZyQktCPkIyL0M6cnMmcx8qdoM7PnMrIyMnI&amp;uid=e96fb03443f13a7818306ad06a9a551c&amp;amp;hid=7004e08dc41ef5580b3280b8ff2054c4&amp;pos=5&amp;cid=9…

    2022年9月5日
    2
  • 关于OleDbCommand中操作数据库的几种方法的区别「建议收藏」

    关于OleDbCommand中操作数据库的几种方法的区别「建议收藏」在vb.net中利用OleDb的OleDbCommand类操作数据库,有以下这些方法: ExecuteNoQuery()返回值类型integer,常用来执行增删改操作,返回操作影响的行数ExecuteReader()返回一个只读的数据集,常用来作查询操作ExecuteScalar()返回值类型Object,执行查询,并返回查询所返回的结果集中第一行的第一列,常用来作一

    2022年5月19日
    32
  • 计算机中1kb等于多少字节,1mb等于多少kb「建议收藏」

    计算机中1kb等于多少字节,1mb等于多少kb「建议收藏」⑴计算机的储存容量1MB等于多少KB计算机的储存容量1MB=1024KB。MB,为英文“MByte”的简写,是计算机中的一种储存单位,读作“兆”。存储容量是指存储器可以容纳的二进制信息量,用存储器中存储地址寄存器MAR的编址数与存储字位数的乘积表示。网络上的所有信息都是以“位”(bit)为单位传递的,一个位就代表一个0或1。(1)1mb等于多少kb扩展阅读存储容量是便携存储产品最为关键的参数…

    2022年5月25日
    73
  • 零基础学Java难不难?

    零基础学Java难不难?很多同学在学Java前都会问零基础能学Java吗?Java到底难不难学?本文我就和大家唠唠这个事。有74%的人认为不难,说难学的仅占26%。

    2022年7月7日
    63

发表回复

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

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