【问题标题】:Set-Cookies response header cookies not correctly and immediately set on VPSSet-Cookies 响应标头 cookie 未正确并立即在 VPS 上设置
【发布时间】:2020-04-23 04:56:18
【问题描述】:

我有一个 Spring Boot 应用程序和一些使用 Vue 在我的虚拟专用服务器上使用 Apache Web 服务器制作的静态文件。

我有一个问题,来自后端的 cookie 没有设置,更具体地说,它们没有显示在开发人员工具中。

本地一切正常,它的工作方式如下:

  1. 登陆登陆页面/login
  2. 填写凭据并调用/api/login(后端)
  3. 在响应头中我看到'Set-Cookie: XSRF-TOKEN=ed5479d8-75e0-4a48-affd-e02ded1c17e0; Path=/' 和多个其他响应标头
  4. Cookie 显示在开发者工具中
  5. 访问任意其他端点(例如 /create-pools)
  6. 看到 XSRF-TOKEN cookie 被发送回后端
  7. 看到 X-XSRF-TOKEN cookie 作为标头也被发送到后端,导致调用成功

在我的 VPS 上,流程应该是相同的,但是:

  1. 登陆登陆页面/login
  2. 填写凭据并调用/api/login(后端)
  3. 在响应头中我看到'Set-Cookie: XSRF-TOKEN=ed5479d8-75e0-4a48-affd-e02ded1c17e0; Path=/' 和多个其他响应标头
  4. cookie 不会显示在开发者工具中
  5. 访问任意其他端点(例如 /create-pools)
  6. 看到 XSRF-TOKEN cookie 被发送回后端
  7. X-XSRF-TOKEN cookie 未发送回后端导致调用不成功

所以不知何故,在我的 VPS 上,它不使用或设置 cookie。

值得一提的是,在 apache 配置中我有: SSL引擎开启 SSLCertificateFile /etc/ssl/certs/SSL_certificate_www_test_com.crt SSLCertificateKeyFile /etc/ssl/certs/www.test.com.key SSLCACertificateFile /etc/ssl/certs/www.test.com.cer

    ServerAdmin webmaster@localhost
    DocumentRoot /home/bart/test/static/
    ServerName www.test.com
    ServerAlias test.com

    <Directory /home/bart/test/static>
            AllowOverride All

            <IfModule mod_rewrite.c>
            RewriteEngine On
            RewriteBase /
            RewriteRule ^index\.html$ - [L]
            RewriteCond %{REQUEST_FILENAME} !-f
            RewriteCond %{REQUEST_FILENAME} !-d
            RewriteRule . index.html [L]
            </IfModule>
    </Directory>

    CustomLog ${APACHE_LOG_DIR}/access-test-com.log combined

    ProxyPreserveHost On
    ProxyRequests Off
    ProxyPass /api http://localhost:8082
    ProxyPassReverse /api http://localhost:8082

到目前为止我已经尝试过,但没有奏效:

  • 查看 XHR 调用中的 withCredentials 属性(我已添加,但默认设置为 true 不会改变任何内容)
  • 手动读取 XSRF-TOKEN cookie 以查看其是否存在。它打印了undefined,但奇怪的是它被发送到后端: Cookie:XSRF-TOKEN=ed5479d8-75e0-4a48-affd-e02ded1c17e0;在请求标头中(所以应该有一个 cookie)
  • 在Spring中设置cookie的域名为test.com(这样就不会将cookie设置为localhost)
  • 将Spring中cookie的路径名设置为/

在 proxypass 中,我将 /api 调用发送到后端。奇怪的是,一旦我手动导航到 test.com/api,cookie 就会突然出现(带有路径 /)。如果我在那之后导航到另一个页面,那么cookies就在那里了。在 cookie 出现之前,我似乎首先必须手动访问 /api 端点(它不是页面,而是后端的 HTTP)。

如何为我解决这个未知问题?

问候,

巴特

【问题讨论】:

  • 问题是请求CORS请求吗?对于跨域cookie,您无法通过document.cookie 访问它们是正常的。在开发人员工具中也很难看到它们:您可能需要打开另一个浏览器选项卡到来自适当来源的 URL,以便您可以看到它们(只要访问的 URL 是为了正确的服务器)。
  • @skirtle 这个问题似乎与 CORS 无关。我确实在后端设置了 CORS 标头、方法和来源,但这些都按预期工作。
  • 如果您使用的是 CORS,那么这非常重要并且很可能是您的问题的根源。但是,仅仅因为您正在设置这些标头并不一定意味着您正在使用 CORS,它们也可以在非 CORS 请求上设置。那么请您澄清一下您是否真的在使用 CORS 来处理问题请求?
  • @skirtle 所以可以通过完全删除 cors 配置并接受所有请求来解决问题?回答您的问题:我只在后端设置 Cors 标头、方法和来源,因此如果请求不符合这些配置,它将失败。我没有在请求中发送任何特定于 cors 的标头。所以我猜我没有使用 CORS?
  • @skirtle 回到我之前的评论,我不认为这些是 CORS 请求,因为我的前端在服务器和后端上运行,因此具有相同的来源。

标签: spring-boot cookies apache2 vuex vps


【解决方案1】:

最终它似乎通过改变我调用后端的方式来解决。以前,我使用https://test.com/api 调用它,但我看到使用https://www.test.com/api 的请求正确设置了cookie。而https://test.com/api 电话没有。因此,我通过添加 www 改变了调用后端的方式。

我不知道它为什么会这样工作,但它似乎已经解决了这个问题。如果有人对原因有任何想法,请随时添加评论。现在我会批准这个作为答案。

感谢大家考虑我的问题。

巴特

【讨论】:

    猜你喜欢
    • 2021-05-17
    • 2020-11-22
    • 2022-01-23
    • 1970-01-01
    • 2015-09-12
    • 1970-01-01
    • 2017-07-08
    • 2020-08-16
    • 2014-08-24
    相关资源
    最近更新 更多