我使用的是Java 8、Wildfly 11、Spring4和Apache2.4。我有这段Java代码来设置会话cookie
cookie = new Cookie(SESSION_ID_KEY, sessionId);
...
final String domain = request.getServerName().indexOf(".") == -1 ? request.getServerName() : request.getServerName().substring(request.getServerName().indexOf(".") + 1, request.getServerName().length());
if (!StringUtils.equals(domain, "localhost") && !isIpAddress)
{
cookie.setDomain(domain.indexOf('.') > -1 ? "." + domain : domain);
} // if
final String contextPath = request.getContextPath() != null && request.getContextPath().endsWith("/") ? request.getContextPath().substring(0, request.getContextPath().length() - 1): request.getContextPath();
cookie.setPath(contextPath);
System.out.println("setting domain " + domain + " and context path:" + contextPath);
response.addCookie(cookie);我注意到在我的浏览器中没有创建这个cookie。然后我查看了Postman,注意到cookies没有被创建,尽管我看到了这些响应头……
Set-Cookie →MY.SESSION.ID=10c25010534c4dd3900851ec1dfaebeb; path=/context; domain=.compute-1.amazonaws.com
Set-Cookie →closeTrialNoteDialog=""; Max-Age=0; Expires=Thu, 01-Jan-1970 00:00:00 GMT似乎在没有创建cookie时,响应标头仍然包含此Set-Cookie标头。但是,我不能断定以上两种方法都有什么问题,这会阻止cookie的创建。任何洞察力都值得欣赏,
发布于 2018-05-20 04:54:18
Cookie域必须是特定于您的组织的私有域,而不是许多组织使用的公共域。
在这种情况下,您正在使用的AWS域.compute-1.amazonaws.com未被设置,因为浏览器将其视为公共域,特别是称为“有效顶级域(eTLD)”、“扩展顶级域”和“公共后缀”。常见的顶级域(TLD)包括像.com、.net和.org这样的“通用TLD”(gTLD)和像.us和.uk这样的“国家代码TLD”(ccTLD)。有了公有云,浏览器现在也认为流行的共享云域是“有效的TLD”,包括来自AWS的许多域名,例如您正在尝试使用的域名。
要设置cookie,您需要将Cookie域设置为一个私有域,即谷歌所说的“有效顶级域名加一”(eTLD+1),这意味着您的有效顶级域名加一个子域,例如您的整个完全限定的主机名- ec2-27-123-206-78.compute-1.amazonaws.com。微软使用术语“公共后缀加一”(PS+1)来表示同样的要求。
排除eTLD /公共后缀的Mozilla基础推理
site suffixes
基础参考:https://publicsuffix.org/ (Mozilla
微软排除eTLD /公共后缀的理由
设置cookie时,网站可以使用域属性指定应将cookie发送到哪些主机。浏览器必须阻止在域属性不以当前页的私有域结尾的情况下设置cookie的尝试。如果不这样做,会导致隐私和安全问题。
谷歌铬/铬行为
谷歌指出,Chromium (因此Chrome)在其CookieMonster类的描述中使用"eTLD+1“来存储cookie。
cookies的核心数据结构是CookieMonster成员,它是从一个域到一组cookies_的多映射(允许单个键使用多个值)。每个cookie都由一个CanonicalCookie()表示,它包含可以在cookie中指定的所有信息(请参见图表和RFC2695)。设置后,cookies被放入此数据结构中,检索涉及到搜索此数据结构。此数据结构的关键字是Cookie域的最具包容性的域(最短的点分隔后缀),该Cookie域没有命名域名注册商(即"google.com“或"bbc.co.uk",但不是"co.uk”或"com")。这也称为有效的顶级域加一,简称为eTLD+1。
https://www.chromium.org/developers/design-documents/network-stack/cookiemonster
包括amazonaws.com在内的域列表
你可以在Mozilla的PublicSuffix.org上发布的源代码中看到火狐使用的有效顶级域名的列表。谷歌CookieMonster页面也引用了PublicSuffix.org。此列表包括许多AWS域名,其中包括您尝试用于EC2的域名,由亚马逊提交。
// Amazon Elastic Compute Cloud : https://aws.amazon.com/ec2/
// Submitted by Luke Wells <psl-maintainers@amazon.com>
*.compute.amazonaws.com
*.compute-1.amazonaws.com
*.compute.amazonaws.com.cn
us-east-1.amazonaws.comhttps://publicsuffix.org/list/effective_tld_names.dat
注意:我刚刚注意到saurav kumar在评论中发布了Mozilla链接。
发布于 2018-05-18 19:36:33
您尝试为亚马逊EC2实例设置Cookie的问题。从一方面来说,这是不可能的,因为它是公共后缀的一部分,如前所述,出于安全原因,您不能这样做。
从另一个角度来看,这是没有意义的,因为这个公共地址:"ec2-27-123-206-78.compute-1.amazonaws.com/context/login“是动态的,并且它不是为您固定的。它是DNS代理,当前为您保留。如果您想从EC2实例设置cookie,您应该设置您自己的主机名的域名,该域名位于EC2实例前面。
request.getServerName()
发布于 2018-05-14 22:03:09
如果响应头包含set-cookie,则必须已创建cookie。尝试删除set-domain,将其设为默认值。也可以尝试设置最大年龄。
https://stackoverflow.com/questions/50300127
复制相似问题