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;

  }

}

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 《前端运维》一、Linux基础–02用户与权限

    其实说真的,这些基础挺枯燥的,内容呢绝大多数都是些静态的。上一篇文章我们学习了基本的指令和vim编辑器的操作方法。这篇文章我们主要来学习下Linux中用户的概念和权限相关的知识。一、用户与用户组

  • Python 学习笔记 变量 xxx XXX「建议收藏」

    Python 学习笔记 变量 xxx XXX「建议收藏」Python学习笔记变量xxxXXXname=”adalovelace”print(name.title())print(name.upper())print(name.lower())first_name=”ada”last_name=”lovelace”full_name=first_name+””+last_nameprint(full_name)print(“Hello,”+…

  • 闫学灿acwing_算法基础课acwing下载

    闫学灿acwing_算法基础课acwing下载给定一个长度为 N 的数列 A,以及 M 条指令,每条指令可能是以下两种之一:C l r d,表示把 A[l],A[l+1],…,A[r] 都加上 d。Q l r,表示询问数列中第 l∼r 个数的和。对于每个询问,输出一个整数表示答案。输入格式第一行两个整数 N,M。第二行 N 个整数 A[i]。接下来 M 行表示 M 条指令,每条指令的格式如题目描述所示。输出格式对于每个询问,输出一个整数表示答案。每个答案占一行。数据范围1≤N,M≤105,|d|≤10000,|A[i]|≤1

  • 大津阈值法原理_ostu阈值分割

    大津阈值法原理_ostu阈值分割具体的公式推导参见冈萨雷斯**《数字图像处理》**Otsu方法又称最大类间方差法,通过把像素分配像素分为两类或多类,计算类间方差,当方差达到最大值时,类分割线(即灰度值)就作为图像分割阈值。Otsu还有一个重要的性质,即它完全基于对图像直方图进行计算,这也使他成为最常用的阈值处理算法之一。算法步骤如下:…

  • Python系列教程一Python入门(一)

    Python系列教程一Python入门(一)前言各位看博客的园友们,大家好,我就是那个风流倜傥的KK,还记得我那篇2019年的年中总结博客吗?我想有许多看博客的园友是没有读过我那篇文章的,KK很生气,后果很严重(开个玩笑了,怎么可能)。给大家

  • vue.js和jquery的区别_人和人类的区别是什么

    vue.js和jquery的区别_人和人类的区别是什么jquery:曾经是前端最流行的js库。vue:是一个精简的MVVM,从技术角度讲。vue.js专注于MVVM模型的ViewModel层,它通过双向数据绑定把view和Model层连接起来,通过对数据的操作就可以完成对页面视图的渲染。vue和jQuery区别:①vue和jQuery对比jquery是使用选择器()选取DOM对象,对其进行赋值、取值、事件绑定等操作,其实和原生的HTML的区别只在于可以更方便的选取和操作DOM对象,而数据和界面是在一起的。②比如需要获取label标签的内..

    2022年10月15日

发表回复

您的电子邮箱地址不会被公开。

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