zoukankan      html  css  js  c++  java
  • httpclient cookie保持会话

    COOKIE保持回话

    httpclient4.x自带维护回话的功能,只要使用同一个httpclient且未关闭连接,就可以使用相同的回话来访问其他要求登陆验证的服务。
    如果需要使用HttpClient池,并且想要做到一次登陆的会话供多个httpClient连接使用,就需要自己保存回话信息。
    客户端的回话信息是保存在cookie中的(JESSIONID),所以只需要将登陆成功返回的cookie复制到各个HttpClient使用即可。
    使用Cookie的方法有两种,可以自己使用CookieStore来保存,也可以通过HttpClientContext上下文来维持
    

    使用cookie的两种方法

    *) 使用CookieStore来保存
    *) 通过HttpClientContext上下文来维持
    

    使用cookie测试登陆

    public void testLogin(){
    //间接创建HttpClient
     HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
     ColseableHttpClient client = httpClientBuilder.build();
    //直接创建client
     CloseableHttpClient client = HttpClients.createDefault();
    //-------------------------------------------------------------------------------- 
     HttpPost httpPost = new HttpPost(loginUrl);
     Map parameterMap = new HashMap();
     paramterMap.put("username","admin");
     paramterMap.put("password","admin123");
    -------------------------------------------------------------------------------- 
     UrlEncodedFormEntity postEntity = new UrlEncodedFormEntity(getParam(paramterMap),"utf-8");
     httpPost.setEntity(postEntity);
     try{
      //--执行post请求
      HttpResponse httpResponse = client.execute(httpPost);
      String location = httpResponse.getFirstHeader("Location").getValue();
      printResponse(httpResponse);
      //--执行get请求
      HttpGet httpGet = new HttpGet(testUrl);
      HttpResponse response1 = client.execute(httpGet);
     printResponse(httpResponse);
    -------------------------------------------------------------------------------- 
     //cookie Store 
     setCookieStore(httpResponse);
     //context  注意顺序
     setContext();
     }catch(Exception e){
      e.printStackTrace();
     }
    }
    -------------------------------------------------------------------------------- 
    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;
      }
    -------------------------------------------------------------------------
    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("
    ", ""));
        }
      }
    

    通过CookieStore保持上下文的回话

    static CookieStore cookieStore = null;
    
    public void testCookieStore() throws Exception{
     //使用cookieStore方式
     cookieStore= setCookieStore();
     CloseableHttpClient client = HttpClients.custom().setDefaultCookieStore(cookieStore).build();
     HttpGet httpGet = new HttpGet(testUrl);
     //执行get请求
     try{
       HttpResponse response = client.execute(httpGet);
       printResponse(response);
     }catch(Exception e){
       e.printStackTrace();  
     }
    }
     
    public static void setCookieStore(HttpResponse response){
      cookieStore = new BasicCookieStore();
      //JSSIONID
      String setCookie - httpResponse.getFirestHeader("Set-Cookie").getValue();
      String JESSIONID = setCookie.substring("JESSIONID=".length(),setCookie.indexOf(";"));
      //新建一个COOKIE
      BasicClientCookie cookie = new BasicClientCookie("JESSIONID",JESSIONID);
      cookie.setVersion(0);
      cookie.setDomain("127.0.0.1");
      cookie.setPath("/path");
      // 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);
    }
    

    使用context上下文保持回话

    static HttpClientContext context = null;
    public void testContext() throws Exception(
     //使用context方式
     CloseableHttpClient client = HttpClients.createDefault():
     HttpGet httpGet = new HttpGet(testUrl);
     try{
     //执行get请求
      HttpResponse httpResponse = client.execute(httpGet,context);
      printResponse(httpResponse);
     }catch(Exception e){
       e.printStackTrace();
     }finally{
       //关闭流并释放资源
       client.close();
     }
    )
    
    public static void 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);
    }
    
  • 相关阅读:
    Android自定义控件之仿美团下拉刷新
    Android性能优化之Bitmap的内存优化
    基于openfire+smack即时通讯instant message开发
    Android各组件/控件间通信利器之EventBus
    android的task任务栈
    Activity的启动模式
    Android 自定义View (一)
    Android之Handler用法总结
    Android中轻松使用线程
    Android 中Activity,Window和View之间的关系
  • 原文地址:https://www.cnblogs.com/ssgao/p/8829056.html
Copyright © 2011-2022 走看看