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)


相关推荐

  • git每次push和pull都要输入密码

    git每次push和pull都要输入密码

  • 手机修改ntp服务器地址,修改手机ntp服务器ip地址[通俗易懂]

    手机修改ntp服务器地址,修改手机ntp服务器ip地址[通俗易懂]修改手机ntp服务器ip地址内容精选换一换本文介绍使用云手机服务时需要了解的基本概念。云手机是一台包含原生安卓操作系统,具有虚拟手机功能的云服务器,简单来说,云手机=云服务器+AndroidOS。您可以远程实时控制云手机,实现安卓APP的云端运行;也可以基于云手机的基础算力,高效搭建应用,如云游戏、移动办公、直播互娱等场景。服务器是用来提供云手机的物理服务器。云手机目前以服务器您可以直接修改虚…

  • c++和java的前景谁更好?

    c++和java的前景谁更好?两门语言都学到能写App的程度是不难。汉小哲觉得但是精通哪怕一门语言都是非常有挑战的。1、C语言是继机器编码、汇编语言之后第一个和计算机语言最为接近的语言,所以它做底层主流语言地位是不可动摇的,java的市场份额比c语言要大,但是在性能上面,C语言要比java快,但是c语言学习没有java简单,在工资方面很多公司c语言的待遇要比java的好。2、一般的C语言,不仅仅说的是c,而是c和c++,c/c++学习难度要大,应用面没有java广,java学习简单写,应用广,比如web开发、手机应有软件开

  • Android SVN开发实战的文件夹结构呈现

    Android SVN开发实战的文件夹结构呈现

    2021年12月31日
  • CSDN 博客备份工具「建议收藏」

    CSDN 博客备份工具「建议收藏」前言核心登录模块备份模块博文扫描模块演示如何使用效果总结前言近段时间以来,听群友博友都在谈论着一件事:“CSDN博客怎么没有备份功能啊?”。这其实也在一定程度上表征着大家对于文章这种知识性产品的重视度越来越高,也对于数据的安全提高了重视。所以我就尝试着写了这么一个工具。专门用来备份CSDN博友的博客。核心说起来是核心,其实也就那么回事吧。严格来说也就是一对代码,不能称之为核心啦。

  • javaScript系列:js中获取时间new Date()详细介绍

    varmyDate=newDate();myDate.getYear();//获取当前年份(2位)myDate.getFullYear();//获取完整的年份(4位,1970-????)m

    2021年12月27日

发表回复

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

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