【问题标题】:How to get token in java如何在java中获取token
【发布时间】:2017-08-04 21:14:57
【问题描述】:

我有以下实现从表单身份验证中获取令牌。

预期的输出如下:

但是,当我运行我的实现时,我得到如下。在响应对象中,我没有看到token。我不是 Java 专家,我想知道我缺少什么。

Login form get: HTTP/1.1 200 OK
response: HttpResponseProxy{HTTP/1.1 200 OK [Cache-Control: max-age=0, Content-Type: application/json, Date: Fri, 04 Aug 2017 21:05:04 GMT, transaction_id: 729097fd-69ac-b813-26c7-015daf10ddfd, X-Powered-By: Express, Content-Length: 684, Connection: keep-alive] ResponseEntityProxy{[Content-Type: application/json,Content-Length: 684,Chunked: false]}}
Post logon cookies:
None

这里是源代码:

BasicCookieStore cookieStore = new BasicCookieStore();
CloseableHttpClient httpclient = HttpClients.custom()
            .setDefaultCookieStore(cookieStore)
            .build();

HttpHost proxy = new HttpHost("xxx.xxx.xxx.com", 80, "http");
RequestConfig  config = RequestConfig.custom()
         .setProxy(proxy)
         .build();

HttpUriRequest login = RequestBuilder.post()
     .setUri(new URI("https://api.xxx.com:443/tokens"))
     .addParameter("username", "stackoverflow")
     .addParameter("password", "isbest!")
     .setConfig(config)
     .build();

CloseableHttpResponse response2 = httpclient.execute(login);
HttpEntity entity = response2.getEntity();
System.out.println("Login form get: " + response2.getStatusLine());

EntityUtils.consume(entity);
System.out.println("response: " + response2);

System.out.println("Post logon cookies:");
List<Cookie> cookies = cookieStore.getCookies();
if (cookies.isEmpty()) {
    System.out.println("None");
} else {
    for (int i = 0; i < cookies.size(); i++) {
    System.out.println("- " + cookies.get(i).toString());
}

【问题讨论】:

    标签: java apache-httpclient-4.x http-proxy form-authentication


    【解决方案1】:

    当您调用EntityUtils#consume(HttpEntity) 时,您将完全消耗响应的内容并关闭底层流。但是,您实际上并未将响应数据读入代码可访问的任何变量中,因此您不再有机会查看它。

    改为调用获取响应数据的方法之一。对此的选项包括HttpEntity#getContent() 以将响应正文作为原始InputStream 访问或EntityUtils#toString(HttpEntity, Charset) 将整个响应正文作为String 读取。 (在后一种情况下,请注意,如果响应主体很大,将整个响应主体作为String 一次读取会影响进程的内存占用。)在调用其中任何一个之后,您可以将检索到的内容通过您的用于检索 "token" 的首选 JSON 解析器。

    完成所有操作后,调用EntityUtils#consume(HttpEntity) 以保证清除实体封装的任何底层资源(例如流)仍然是一种好习惯。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-07
      • 1970-01-01
      • 2014-04-20
      • 2023-03-18
      • 2023-03-06
      • 1970-01-01
      • 2021-12-02
      • 2011-02-07
      相关资源
      最近更新 更多