我有一个应用程序运行了一年多,做的事情看起来像是在抓取网站.现在,我想设置网站在其标题中返回的Cookie,但几天后,HttpCookie.parse()方法似乎无法解析包含JSON的Cookie.

这太奇怪了,我不认为这是真的,但也许你以前有过这个?

下面是一个例子:

your_cookie_name={"key":"value","key2":"value2"}; Max-Age=3600; Path=/; Secure; HttpOnly

Java执行以下操作:

1. HttpCookie.parse("your_cookie_name={"key":"value","key2":"value2"}; Max-Age=3600; Path=/; Secure; HttpOnly")

然后:

2. HttpCookie.splitMultiCookies("your_cookie_name={"key":"value","key2":"value2"}; Max-Age=3600; Path=/; Secure; HttpOnly").

但这会产生2个Cookie的列表:

enter image description here

然后,它将try 解析每个Cookie,但在第二个Cookie上失败,因为它不包含=符号:

3. HttpCookie.parseInternal(""key2":"value2"}; Max-Age=3600; Path=/; Secure; HttpOnly")

enter image description here

但我真的不敢相信它不能解析包含JSON的cookie.你能帮帮我吗?有什么背景吗?

推荐答案

问题是Cookie值不符合官方的Cookie语法.RFC 6256表示Cookie-Value由

*cookie-octet / ( DQUOTE *cookie-octet DQUOTE )

其中,cookie-octet是:

US-ASCII characters excluding CTLs, whitespace, DQUOTE, comma,
semicolon, and backslash

CTL是ASCII控制字符,DQUOTE是ASCII双引号字符(").

您的JSON包含双引号和逗号.这会导致Cookie被parse方法拒绝.

如果您想在Cookie中传递任意JSON,那么您需要做一些事情来"隐藏"任何不允许的字符:

  • 如果JSON编码为ASCII,则可以使用百分比编码或Base64编码.
  • 如果JSON是用UTF8编码的,那么建议使用Base64.

此外,请注意Cookie的大小可能有限制(包括名称、值和属性).

Java相关问答推荐

Selenium Java:无法访问IFRAME内部的元素

表格栏上的事件过滤器在PFA中不起作用

无法处理批处理侦听器中的反序列化异常

对于几乎不涉及逻辑的请求,您是否应该使用命令模式?

当涉及到泛型时,类型推理在Java中是如何工作的?

Mapstruct不能正确/完全映射属性

第二次按下按钮后,我需要将按钮恢复到其原始状态,以便它可以再次工作

Mac上的全屏截图在使用JavaFX时不能正常工作吗?

使用UTC时区将startDatetime转换为本地时间

对字符串长度进行排序,但颠倒了顺序(最长字符串在前)

为什么同步数据块无效?

如何将Java文档配置为在指定的项目根目录中生成?

视图被推出线性布局-Android

JavaFX:为什么我的ComboBox添加了一个不必要的单元格的一部分?

如何在Spring Boot中为不同的部署环境管理多个.properties文件?

没有Google Play服务,Firebase Auth无法工作

如何从指定某些字段的父对象创建子对象

message.acknowledge()没有';在使用Spring Boot在ActiveMQ中读取消息后,t将消息出列

从 Java 17 切换回 Java 8 后出现的问题

Vaadin Flow:设置密码显示按钮属性