如何在https连接上检索cookie?

时间:2012-09-21 15:13:40

标签: java cookies https jsoup

我正在尝试将Cookie保存在使用SSL的URL中,但始终返回NULL。

private Map<String, String> cookies = new HashMap<String, String>();

    private Document get(String url) throws IOException {
            Connection connection = Jsoup.connect(url);
            for (Entry<String, String> cookie : cookies.entrySet()) {
                connection.cookie(cookie.getKey(), cookie.getValue());
            }
            Response response = connection.execute();
            cookies.putAll(response.cookies());
            return response.parse();
        }

    private void buscaJuizado(List<Movimentacao> movimentacoes) {
            try {
                Connection.Response res = Jsoup                          .connect("https://projudi.tjpi.jus.br/projudi/publico/buscas/ProcessosParte?publico=true")
  .userAgent("Mozilla/5.0 (Windows NT 6.1; rv:15.0) Gecko/20120716 Firefox/15.0a2")
  .timeout(0)
  .response();
  cookies = res.cookies();
  Document doc = get("https://projudi.tjpi.jus.br/projudi/listagens/DadosProcesso?  numeroProcesso=" + campo);
  System.out.println(doc.body());
  } catch (IOException ex) {
     Logger.getLogger(ConsultaProcessoTJPi.class.getName()).log(Level.SEVERE, null, ex);
  }
}

我尝试在第一次连接时捕获cookie,但始终将它们设置为NULL。由于安全连接(HTTPS),我认为它可能是一些Cois 有什么想法吗?

1 个答案:

答案 0 :(得分:1)

问题不是HTTPS。问题或多或少是一个小错误。

要解决您的问题,您只需将.response()替换为.execute()即可。像这样,

private void buscaJuizado(List<Movimentacao> movimentacoes) {
  try {
    Connection.Response res = Jsoup
      .connect("https://projudi.tjpi.jus.br/projudi/publico/buscas/ProcessosParte?publico=true")
      .userAgent("Mozilla/5.0 (Windows NT 6.1; rv:15.0) Gecko/20120716 Firefox/15.0a2")
      .timeout(0)
      .execute(); // changed fron response()
    cookies = res.cookies(); 
    Document doc = get("https://projudi.tjpi.jus.br/projudi/listagens/DadosProcesso?numeroProcesso="+campo);
    System.out.println(doc.body());
  } catch (IOException ex) {
    Logger.getLogger(ConsultaProcessoTJPi.class.getName()).log(Level.SEVERE, null, ex);
  }
}


总的来说,你必须首先确保你执行请求 在请求已被执行后,调用.response()对于抓取Connection.Response对象非常有用。显然,如果您没有执行请求,Connection.Response对象将不会非常有用。

事实上,如果您尝试在未执行的响应中调用res.body(),您将收到以下指示问题的异常。

  

java.lang.IllegalArgumentException:在获取响应正文之前必须执行请求(使用.execute(),. get()或.post()