【问题标题】:unable to create and set cookie to handle JSESSSIONID无法创建和设置 cookie 来处理 JSESSSIONID
【发布时间】:2016-04-21 22:22:13
【问题描述】:

我们有一个基于 Java 的应用程序,可以从网站下载文件

必须登录才能访问网站的内容(和下载)

所有这些都是作为这个 Java 应用程序的一部分使用 Apache HttpClient 4.3.3 完成的

不幸的是,代码一直实现登录并在网络服务器上创建不需要的会话(~10000+)

网站一旦登录,它就会提供一个 JSESSSIONID 作为 cookie 的一部分。

我想到的是从 cookie 中获取这个 JSESSIONID 并创建 cookie 并将其设置为下一次调用的一部分。

以下是我所做的

  • 第一次执行 url 后,我从 cookie 中读取 JSESSIONID 并存储在文本文件中
  • 在第二次运行期间,我读取文本文件并获取 JSESSIONID 的值并创建一个 cookie 并设置它
  • 调用ClosableHTTPClient的执行我将上下文与cookie一起传递

下面是我的代码sn-p

CloseableHttpClient httpClient = null;
httpClient = HttpClientBuilder.create().useSystemProperties().build();
HttpClientContext  localContext = HttpClientContext.create();
BasicCookieStore cookieStore = new BasicCookieStore();
cookie.setDomain("sso.comp.com");
cookie.setPath("/");            
cookie.setAttribute("JSESSIONID", "dfafdffddasfad32423423_!ad");
cookieStore.addCookie(cookie);
localContext.setAttribute(HttpClientContext.COOKIE_STORE, cookieStore);
localContext.setCookieStore(cookieStore);
CloseableHttpResponse response = null;
response = httpClient.execute(get,localContext);

这总是导致 HTTP 401 Unauthorized

请注意,我的应用程序每次都会从头开始下载,但在几秒/分钟的空间内

任何帮助将不胜感激

【问题讨论】:

  • 如何将 cookie 本身作为内存对象存储在某个地方并再次使用它?
  • 问题是应用程序在 60 分钟内多次关闭并重新启动。
  • 在我看来,cookie 序列化/反序列化的方式出了点问题。所以我想检查是否有任何选项可以使用除写入文件之外的任何其他选项。

标签: java apache-httpclient-4.x apache-commons-httpclient


【解决方案1】:

您以错误的方式创建 cookie。方法setAttribute用于设置cookie attributes

CookieStore cookieStore = new BasicCookieStore();
BasicClientCookie cookie = new BasicClientCookie("JSESSIONID", "dfafdffddasfad32423423_!ad");
cookie.setDomain("sso.comp.com");
cookie.setPath("/");
cookie.setAttribute(ClientCookie.DOMAIN_ATTR, "true");
cookieStore.addCookie(cookie);

要验证 cookie 是否以写入格式发送,您可以启用 http client wire traces 或嗅探 HTTP 流量...

【讨论】:

    猜你喜欢
    • 2013-09-01
    • 1970-01-01
    • 2018-11-28
    • 1970-01-01
    • 2022-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-16
    相关资源
    最近更新 更多