无效的 cookie 标头:过期属性为空时无法解析过期属性

Posted

技术标签:

【中文标题】无效的 cookie 标头:过期属性为空时无法解析过期属性【英文标题】:Invalid cookie header : Unable to parse expires attribute when expires attribute is empty 【发布时间】:2012-02-29 14:17:04 【问题描述】:

android 应用程序中,当使用 DefaultHttpClient 获取 URL 内容(执行 HttpGet)时,我在日志中收到以下警告:

W/ResponseProcessCookies(20386): Invalid cookie header: "Set-Cookie: NSC_vbue_iuuq=ffff660; expires=; domain=private.false.name; path=/; isSecure=false". Unable to parse expires attribute:

我理解该警告,因为 expires 字段不包含有效的日期格式。我理解它可能是因为它是一个“会话 cookie”(不是专家)。 Thread about similar situation in Curl context

在网上搜索我发现主要是

.setParameter(ClientPNames.COOKIE_POLICY, CookiePolicy.BEST_MATCH (or other) )

通过正确解析包含逗号的日期来避免警告的选项。

但是,我想避免使用该日志。 (不是通过禁用日志) 我相信内部一切都很好,因为“我猜”,cookie.setExpiryDate() 根本没有被调用。

您认为我需要对我的 HTTP 客户端进行特定配置(我没有设置特定配置)以避免该警告或支持空过期吗?

谢谢。

【问题讨论】:

【参考方案1】:

如果您不介意更改 CookieSpec,您可以提供自己的、更宽松的子类。

首先,创建一个宽松的CookieSpec,它将接受nullexpires 属性的空值,如下所示:

class LenientCookieSpec extends BrowserCompatSpec 
    public LenientCookieSpec() 
        super();
        registerAttribHandler(ClientCookie.EXPIRES_ATTR, new BasicExpiresHandler(DATE_PATTERNS) 
            @Override public void parse(SetCookie cookie, String value) throws MalformedCookieException 
                if (TextUtils.isEmpty(value)) 
                    // You should set whatever you want in cookie
                    cookie.setExpiryDate(null);
                 else 
                    super.parse(cookie, value);
                
            
        );
    

现在您需要在您的 HTTP 客户端中注册并选择这个新的CookieSpec

DefaultHttpClient client = new DefaultHttpClient();
client.getCookieSpecs().register("lenient", new CookieSpecFactory() 
        public CookieSpec newInstance(HttpParams params) 
            return new LenientCookieSpec();
        
    );
HttpClientParams.setCookiePolicy(client.getParams(), "lenient");

“像这样”的东西可能对你有用。

【讨论】:

感谢您的评论。确实应该工作,我不知道我可以那样做。但我现在想知道是否可以预期具有此空过期的服务器 cookie 格式?我不是服务器的所有者,所以我应该向服务器所有者报告情况吗?问候, 好吧,他们发送坏 cookie 并不理想 - 哦,我相信 Apache 中的所有 CookieSpec 实现有时对解析有点 anal 刚刚查看了关于此的 rfc2109,似乎我误解了 expires=; 的事实。在查看 codeproject.com/Articles/3106/… 中的 cmets 时无效,其中“空白”日期指的是日期,例如 (01-Jan-0001 00:00:00【参考方案2】:

我刚刚收到类似下面的警告

Invalid cookie header: "Set-Cookie: A3=d=AQABBPA3c18CEOtNC3d8X1pEkCvrf2cxZRIFEgEBAQGJdF99XwAAAAAA_SMAAA&S=AQAAAiTHBvO_oaoz8tCr1A7ArCs; Expires=Wed, 29 Sep 2021 19:34:41 GMT; Max-Age=31557600; Domain=.yahoo.com; Path=/; SameSite=None; Secure; HttpOnly". Invalid 'expires' attribute: Wed, 29 Sep 2021 19:34:41 GMT

我的env是http client-4.5.12,原因是cookiesSpec需要设置。

修复方法(忽略其他参数)

requestConfig = RequestConfig.custom().setCookieSpec(CookieSpecs.STANDARD).build();

        httpclient = HttpClients.custom()
               .setDefaultRequestConfig(requestConfig).build();

这里你可以根据你的情况改变CookieSpecs.XXX,在大多数情况下,STANDARD是可以的,细节可以参考最新的apache doc https://hc.apache.org/httpcomponents-client-4.5.x/tutorial/html/statemgmt.html

注意 HttpClientParams(之前提到的一些页面)是一个已弃用的类,只需使用 RequestConfig 作为替代。

【讨论】:

以上是关于无效的 cookie 标头:过期属性为空时无法解析过期属性的主要内容,如果未能解决你的问题,请参考以下文章

过期 cookie 标头中的字符串

缓存为空时获取音频文件的持续时间属性的问题

BigQuery - Apache Avro 库无法解析标头并出现以下错误:数据文件无效。魔法不匹配

Jersey 客户端错误 - 无法解析无效的 Content-Type 标头(需要解决方法)

收到包含无效 cookie 的 cookie 标头。

easyui-combogrid必填为空时无法通过表单验证的问题