HttpClient4.x 使用cookie保持会话

来源:互联网 发布:杭州汉聚网络骚扰电话 编辑:程序博客网 时间:2024/04/26 14:47
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;  }}
0 0
原创粉丝点击