Java 正在为www.example.com而不是example.com设置cookie

Java 正在为www.example.com而不是example.com设置cookie,java,apache,tomcat,cookies,Java,Apache,Tomcat,Cookies,我有一个java应用程序在tomcat下运行,tomcat由ApacheWebServer支持。 在我的代码中,我将cookie域设置为 .example.com 但我的cookies仍然显示在客户机浏览器的www.example.com下,而不是example.com下。什么是如此奇怪的google analytics cookies出现在example.com下,但我自己的代码无法在example.com下存储cookies Apache服务器的设置使example.com请求在客户端浏览器

我有一个java应用程序在tomcat下运行,tomcat由ApacheWebServer支持。 在我的代码中,我将cookie域设置为 .example.com

但我的cookies仍然显示在客户机浏览器的www.example.com下,而不是example.com下。什么是如此奇怪的google analytics cookies出现在example.com下,但我自己的代码无法在example.com下存储cookies

Apache服务器的设置使example.com请求在客户端浏览器地址栏中显示为www.example.com(如果与问题相关)?我确实需要生成这个不同的会话id,例如example.com和www.example.com,这对我的应用程序不好

Apache服务器的设置如下: 例如,requests.com显示为 在客户端浏览器中访问www.example.com 地址栏,如果它与 问题

我不是100%确定,但这似乎是问题的根源。Apache如何使客户端浏览器显示www.example.com而不是example.com?最有可能的方法是将example.com的每个请求重定向到www.example.com。当浏览器处理重定向时,它发送对www.example.com的请求,并从该点开始认为它正在使用www.example.com

现在,当响应头中有一个集合Cookie时会发生什么?它显然会将其视为来自www.example.com。浏览器不可能允许此类cookie将其域设置为.example.com,因为这将是一个安全问题。假设mysite.somefreehosting.com为域设置cookie.somefreehosting.com。然后,someothersite.somefreehosting.com将收到此cookie,这可能会导致很多麻烦。该标准规定应拒绝此类cookie,但如果某些浏览器足够聪明,能够处理此类情况并将.example.com视为www.example.com,我也不会感到惊讶

当然,我建议您通过发送一个类似lwp请求脚本的请求来检查站点到底向浏览器发送了什么。您将看到正在发生的重定向以及响应中实际设置的头,如下所示:

alqualos@ubuntu:~$ lwp-request -sSed http://google.com/
GET http://google.com/ --> 301 Moved Permanently
GET http://www.google.com/ --> 302 Found
GET http://www.google.co.il/ --> 200 OK
Cache-Control: private, max-age=0
Connection: close
Date: Sat, 18 Dec 2010 18:54:57 GMT
Server: gws
Content-Type: text/html; charset=windows-1255
Content-Type: text/html; charset=windows-1255
Expires: -1
Client-Date: Sat, 18 Dec 2010 18:54:57 GMT
Client-Peer: 173.194.37.104:80
Client-Response-Num: 1
Set-Cookie: PREF=ID=368e9cfd56643257:FF=0:TM=1292698497:LM=1292698497:S=s-Jur84NgaNH5Mzx; 
  expires=Mon, 17-Dec-2012 18:54:57 GMT; path=/; domain=.google.co.il
Set-Cookie: NID=42=bZ6goDV_b2MiWlTMONwiijaON5U_TBGB2_yNheonEwA1GVLU77EhyfUhk9Wvj70xTFrpvGy4s_aBp1UZtvRRnsnYjacjz_UVx0_iSr9R3nYXMyRtwkS5qV98_Egb16pZ; 
  expires=Sun, 19-Jun-2011 18:54:57 GMT; path=/; domain=.google.co.il; HttpOnly
Title: Google
X-XSS-Protection: 1; mode=block

我检查了发送该请求,得到了与google相同的get序列:get-->http//example.com 301永久移动到http//www.example.com获取-->302临时移动获取-->200确定。谷歌发现的唯一区别是302。这条消息并不重要。代码才是最重要的。您的上一个URL被SO引擎解析,但我认为它是http//www.example.com/user/uid?在这种情况下,出于安全原因,您将无法为.example.com设置cookies。你为什么要这样?对不起,我是说http//www.example.com/user/uid。由于linux命令lwp不接受cookies,我的代码将重定向到http//www.example.com/user/uid,这是意料之中的。但是,如果在客户端浏览器上启用cookie,则不会发生此重定向。我的grails应用程序有URL映射,表示对“/”的任何请求,这意味着对example.com的请求将自动重定向到example.com/user/index(用于用户身份验证/cookie检查)。我不知道grails在内部是如何做到这一点的——它甚至可能不是redirect.example.com或www.example.com?我的观点是,如果浏览器在地址栏中显示www.example.com,它将不接受.example.com的cookies(因为请求主机名不匹配),这是意料之中的。请注意,为了进一步调试,您可以使用类似于
-H'Cookie:sessiond=12345'
的语法发送带有lwp请求的Cookie。