博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HttpClient4.x 使用cookie保持会话
阅读量:7007 次
发布时间:2019-06-27

本文共 7545 字,大约阅读时间需要 25 分钟。

hot3.png

HttpClient4.x可以自带维持会话功能,只要使用同一个HttpClient且未关闭连接,则可以使用相同会话来访问其他要求登录验证的服务(见TestLogin()方法中的“执行get请求”部分)。

如果需要使用HttpClient池,并且想要做到一次登录的会话供多个HttpClient连接使用,就需要自己保存会话信息。因为客户端的会话信息是保存在cookie中的(JSESSIONID),所以只需要将登录成功返回的cookie复制到各个HttpClient使用即可。
使用Cookie的方法有两种,可以自己使用CookieStore来保存(见TestCookieStore()方法),也可以通过HttpClientContext上下文来维持(见TestContext()方法)。
附带HttpClient4.3示例代码 。

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
registry = RegistryBuilder .
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
getParam(Map parameterMap) { List
param = new ArrayList
(); 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://my.oschina.net/yiqifendou/blog/916396

你可能感兴趣的文章
linux下grep、egrep及相应的正则表达式和用法
查看>>
登录shell和非登录shell
查看>>
pear的安装
查看>>
为什么要编写轻量级的View Controller??
查看>>
IT工程师如何规划职业生涯
查看>>
冒泡排序-方法2
查看>>
继承重写NetworkLobbyPlayer之后无法创建GamePlayer的解决办法
查看>>
RequestDispatcher
查看>>
Form action defaulting to 'action' attribute's literal value.
查看>>
02 Getting Started with the Oracle Server
查看>>
LINUX DNS SERVER
查看>>
C#面向对象基础(六) 继承
查看>>
linux 下free用法
查看>>
去除dedecms底部中的powerby
查看>>
今天开始用日志记录我工作中遇见的故障和排除方法
查看>>
洛谷——P1988 火炬
查看>>
WinCE6.0+S3C6410 USB驱动架构分析
查看>>
96django_modelform
查看>>
Dcdiag 命令详解luov总结
查看>>
回形排列
查看>>