【发布时间】:2020-04-23 04:56:18
【问题描述】:
我有一个 Spring Boot 应用程序和一些使用 Vue 在我的虚拟专用服务器上使用 Apache Web 服务器制作的静态文件。
我有一个问题,来自后端的 cookie 没有设置,更具体地说,它们没有显示在开发人员工具中。
本地一切正常,它的工作方式如下:
- 登陆登陆页面/login
- 填写凭据并调用/api/login(后端)
- 在响应头中我看到'Set-Cookie: XSRF-TOKEN=ed5479d8-75e0-4a48-affd-e02ded1c17e0; Path=/' 和多个其他响应标头
- Cookie 显示在开发者工具中
- 访问任意其他端点(例如 /create-pools)
- 看到 XSRF-TOKEN cookie 被发送回后端
- 看到 X-XSRF-TOKEN cookie 作为标头也被发送到后端,导致调用成功
在我的 VPS 上,流程应该是相同的,但是:
- 登陆登陆页面/login
- 填写凭据并调用/api/login(后端)
- 在响应头中我看到'Set-Cookie: XSRF-TOKEN=ed5479d8-75e0-4a48-affd-e02ded1c17e0; Path=/' 和多个其他响应标头
- cookie 不会显示在开发者工具中
- 访问任意其他端点(例如 /create-pools)
- 看到 XSRF-TOKEN cookie 被发送回后端
- 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