当前位置: 首页 > 知识库问答 >
问题:

使用Java 11 HttpClient设置会话cookie

柴声
2023-03-14
public static void main(String[] args) throws IOException, InterruptedException {
  String year = args[0];
  String day = args[1];
  String session = System.getenv("AOCSESSION");
  System.out.println(session);
  
  HttpRequest req = HttpRequest.newBuilder()
      .uri(URI.create("https://adventofcode.com/"+year+"/day/"+day+"/input")).GET().build();
  CookieManager cookieManager = new CookieManager();
  HttpCookie cookie = new HttpCookie("session", session);
  cookieManager.getCookieStore().add(URI.create("https://adventofcode.com"), cookie);
  HttpClient client = HttpClient.newBuilder().cookieHandler(cookieManager).build();

  String body = client.send(req, BodyHandlers.ofString()).body();
  System.out.println(body);
}
cookie.setDomain(".adventofcode.com");
cookie.setMaxAge(Instant.parse("2031-11-01T18:26:23.293Z").getEpochSecond());
cookie.setPath("/");
cookie.setHttpOnly(true);
cookie.setSecure(true);

但这并不能解决问题。

如何向请求添加会话cookie?

共有1个答案

高琛
2023-03-14

查看JDK文档,有一个CookieHandler。

CookieHandler对象提供回调机制,将HTTP状态管理策略实现连接到HTTP协议处理程序中。HTTP状态管理机制指定了一种使用HTTP请求和响应创建有状态会话的方法。

可以通过执行CookieHandler.setDefault(CookieHandler)注册要由HTTP URL流协议处理程序使用的系统范围的CookieHandler。可以通过调用CookieHandler.getDefault()来检索当前注册的CookieHandler。有关HTTP状态管理的更多信息,请参见RFC2965:HTTP状态管理机制

HttpClient.newBuilder()
                        .authenticator(Authenticator.getDefault())
                        .connectTimeout(Duration.ofSeconds(30))
                        .cookieHandler(CookieHandler.getDefault())
                        .executor(Executors.newFixedThreadPool(2))
                        .followRedirects(Redirect.NEVER)
                        .priority(1) //HTTP/2 priority
                        .proxy(ProxySelector.getDefault())
                        .sslContext(SSLContext.getDefault())
                        .version(Version.HTTP_2)
                        .sslParameters(new SSLParameters())
                        .build();
 类似资料:
  • 帮助将cookie设置为HttpClient 创建了一个登录到外部web服务的程序。但是,要从HTTP GET获取重要信息,我无法传入cookie(从登录生成)。 app.java(使用ClientHelper的类): 当我运行应用程序时,我可以登录(我看到生成的JSON),但是getProfile()方法返回一个空的JSON对象: 在命令行中,我试图使用curl来模拟以下情况:

  • 问题内容: 我有一个spring / jdbc / oracle 10g应用程序。Oracle服务器数据库时区设置为GMT + 2 JVM时区设置为GMT + 2(即使对于我而言这无关紧要)。 我有一个执行某些日期操作的存储过程。问题是,即使我未在代码/配置中明确设置会话时区,会话时区也不同于数据库时区(GMT)。 据我所知,会话时区默认情况下等于数据库时区。知道为什么会话时区与数据库时区不同,或

  • 问题内容: 是否可以使用Javascript设置PHP会话变量? 问题答案: 在JavaScript中: 在session_write.php文件中: 在HTML中:

  • 我有一个运行在Tomcat5上的非常好用的web Java1.5web应用程序。应用程序依赖于它的会话,所以只要会话Cookie被传递出去,或者JSESSIONID出现在上下文路径的末尾,就可以正常工作,就像“;JSESSIONID=...” null

  • Since 8.1 setSessionData 会话数据写入 使用方法 AlipayJSBridge.call('setSessionData', { data: { name: 'Liu Hunan', age: '15' } }); 代码演示 session数据读写 <h2>点击下面按钮来查看效果</h2> <a href="javascript:void(0)"

  • 问题内容: 我正在使用Spring Security 3.0向LDAP服务器进行身份验证,但无法确定自己的会话超时时间。我相信默认值为30分钟,但我需要将其设置为更长的时间 问题答案: 您可以在web.xml中为所有会话设置会话超时(例如60分钟): 或按会话使用 后者您可能要在authorizationSuccessHandler中进行。