2016-03-15 248 views
2

我正试图访问一个网站,并且无法将收集到的“Cookie”添加到传出的POST请求标题中。我已经能够验证它们存在于CookieManager中。如何将cookie添加到HtmlUnit请求标头?

任何替代手段HtmlUnit也将不胜感激。

public static void main(String[] args) 
    { 
     // Turn off logging to prevent polluting the output. 
     Logger.getLogger("com.gargoylesoftware.htmlunit").setLevel(Level.OFF); 

     try { 
      final WebClient webClient = new WebClient(BrowserVersion.CHROME); 



      webClient.getOptions().setCssEnabled(false); 


      CookieManager cookieManager = webClient.getCookieManager(); 

      out.println(cookieManager.getCookies().toString()); 

      out.println("start"); 

      final HtmlPage loginPage = webClient.getPage("my_url"); 


      Map<?, ?> additionalRequest1 = loginPage.getWebResponse().getWebRequest().getAdditionalHeaders(); 

      Iterator<?> ite0 = additionalRequest1.entrySet().iterator(); 
      while(ite0.hasNext()){ 
       out.println(ite0.next()); 
      } 
      out.println("\n"); 

      out.println("after loginPage"); 



      out.println(cookieManager.getCookies().toString()); 

      Set<Cookie> cookies = new HashSet<Cookie>(); 
      cookies.addAll(webClient.getCookieManager().getCookies()); 
      StringBuilder cookieHeader = new StringBuilder(); 

      Iterator<Cookie> ite = cookies.iterator(); 
      while (ite.hasNext()){ 
       Cookie cookie = ite.next(); 
       cookie.getDomain().substring(1); 
       String name = cookie.getName(); 
       String value = cookie.getValue(); 

       System.out.println("Cookie:" + name + "=" +value); 
       webClient.addRequestHeader(name, value); 
      } 


      final HtmlTextInput login = (HtmlTextInput) loginPage.getElementById("login"); 
      login.setValueAttribute(USER_EMAIL); 

      final HtmlPasswordInput password = (HtmlPasswordInput) loginPage.getElementById("password"); 
      password.setValueAttribute(USER_PASS); 


      final HtmlSubmitInput button_submit = loginPage.getElementByName("login_submit"); 

      final HtmlPage accessGrantingPage = button_submit.click(); 
      final HtmlForm requestForm = (HtmlForm)accessGrantingPage.getElementById("consent_form"); 

      Map<?, ?> additionalRequest = accessGrantingPage.getWebResponse().getWebRequest().getAdditionalHeaders(); 

      Iterator<?> ite2 = additionalRequest.entrySet().iterator(); 
      while(ite2.hasNext()){ 
       out.println(ite2.next()); 
      } 
      out.println("\n"); 

      out.println("after accessGrantingPage"); 

      out.println(cookieManager.getCookies().toString()); 
      final HtmlButton consent_accept_button = accessGrantingPage.getElementByName("consent_accept"); 

      try { 
       final HtmlPage authorizationPage = consent_accept_button.click(); 
       out.println("after authorizationPage"); 
       out.println(authorizationPage.getUrl().toString()); 
       out.println(authorizationPage.getWebResponse().getStatusMessage()); 

       out.println(authorizationPage.getWebResponse().getResponseHeaders()); 

      } catch (RuntimeException re){ 
       re.printStackTrace(); 
      } 
      webClient.closeAllWindows(); 
     } catch (IOException ioe){ 
      ioe.printStackTrace(); 
     } finally { 

     } 

    } 

回答

2

我发现我可以通过使用WebClient的setadditionalHeader()来添加标题。

 for (int index = 0; index < boxCookies.size(); index++){ 
      String cookie = boxCookies.toArray()[index].toString(); 
      String cookieNameValue =cookie.substring(0, cookie.indexOf(";")); 
      String name = cookieNameValue.substring(0, cookieNameValue.indexOf("=")); 
      String value = cookieNameValue.substring(cookieNameValue.indexOf("=") + 1); 

      if (index == 0){ 
       cookieHeader.append(name + "=" +value); 
      } else { 
       cookieHeader.append("; "+ name + "=" +value); 
      } 

     } 
     WebRequest secondLoginPage = new WebRequest(AUTHORIZE_URL); 
     secondLoginPage.setAdditionalHeader("Cookie", cookieHeader.toString()); 
     HtmlPage loginPage2 = webClient.getPage(secondLoginPage);