• HttpClient4.x 使用cookie保持会话


    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("	" + iterator.next());
        }
        // 判断响应实体是否为空
        if (entity != null) {
          String responseString = EntityUtils.toString(entity);
          System.out.println("response length:" + responseString.length());
          System.out.println("response content:"
              + responseString.replace("
    ", ""));
        }
      }
    
      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;
      }
    }
  • 相关阅读:
    二SERVLET(2)
    一SERVLET (1)
    eclipse 恢复SVN无法还原的文件 svn使用了还原,但本地的没有提交找回没提交代码的方法
    oracle dual 表
    sql 自增字段的控制 hibernate注解的写法
    sql 集合运算
    join
    group by having where order by
    数据库oracle 驱动版本
    JFreeChart的使用
  • 原文地址:https://www.cnblogs.com/wsy0202/p/12054901.html
Copyright © 2020-2023  润新知