【问题标题】:cookie being set for www.example.com instead of example.com为 www.example.com 而不是 example.com 设置 cookie
【发布时间】:2010-12-18 17:00:01
【问题描述】:

我在 apache 网络服务器前端的 tomcat 下运行 java 应用程序。 在我的代码中,我将 cookie 域设置为 .example.com

但我的 cookie 仍然显示在客户端浏览器中的 www.example.com 下,而不是 example.com 下。什么是奇怪的谷歌分析 cookie 显示在 example.com 下,但我自己的代码无法在 example.com 下存储 cookie?

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

【问题讨论】:

    标签: java apache tomcat cookies


    【解决方案1】:

    Apache 服务器的设置是这样的 example.com 的请求显示为 客户端浏览器中的 www.example.com 地址栏是否与 问题?

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

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

    可以肯定的是,我建议您通过发送带有类似 lwp-request 脚本的请求来检查您的站点向浏览器发送的确切内容。您将看到正在发生的重定向以及响应中实际设置的标头,如下所示:

    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 Moved Permanently http;//www.example.com GET -- > 302 暂时移动 GET example.com/user/uid --> 200 OK。 google 的唯一区别是 302 Found。
    • 消息不重要。代码才是最重要的。您的最后一个 URL 已被 SO 引擎解析,但我认为它是 http;//www.example.com/user/uid?好吧,在这种情况下,出于安全原因,您将无法为 .example.com 设置 cookie。你为什么要那样做?
    • 对不起,我的意思是 http;//www.example.com/user/uid。由于 linux 命令 lwp 不接受 cookie,我的代码将重定向到 http;//www.example.com/user/uid,这是意料之中的。但如果在客户端浏览器上启用了 cookie,则不会发生此重定向。我的 grails 应用程序有 URL 映射,它表示对“/”的任何请求,这意味着对 example.com 的请求将自动重定向到 example.com/user/index(用于用户身份验证/cookie 检查)。我不确定 grails 在内部是如何做到这一点的,它甚至可能不是重定向。
    • example.com 还是 www.example.com?我的观点是,如果浏览器在地址栏中显示 www.example.com,它将不接受 .example.com 的 cookie(因为请求主机名不匹配),这是意料之中的。请注意,为了进一步调试,您可以使用类似 -H 'Cookie: sessid=12345' 的语法发送带有 lwp-request 的 cookie。
    猜你喜欢
    • 2012-06-07
    • 1970-01-01
    • 2013-03-02
    • 2019-10-18
    • 1970-01-01
    • 2018-02-13
    • 1970-01-01
    • 2016-01-16
    • 2014-08-11
    相关资源
    最近更新 更多