Joh*_*auß 8 subdomain session fosuserbundle symfony-2.1
在一个应用程序中,我使用长轮询实现了一个javascript聊天.由于每个域只允许一个Ajax请求,我想将轮询请求移动到子域.
所以我有两个域:
dev.site.com
poll.dev.site.com
Run Code Online (Sandbox Code Playgroud)
在我的config.yml我输入以下内容:
framework:
session:
domain: .dev.site.com
cookie_domain: .dev.site.com
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试通过Ajax在子域上进行轮询,Symfony不会让我登录.
关于如何在子域上保持会话的任何想法?我正在使用FOSUserBundle
小智 2
首先,两个应用程序需要共享fos_user表,以便它们可以重新加载用户。因为您有“一个应用程序和指向同一应用程序的两个域”。这应该已经是正确的了。
接下来是设置要在域和子域之间共享的会话 cookie。您问题中的配置是正确的。然而,当您从 dev.site.com 更改为 poll.dev.site.com 时,为了使 FOSUserBundle 能够重新加载用户,您需要在两个域之间共享会话存储。
我建议的最简单的方法是将会话存储在数据库中。这是通过使用Symfony 中可用的PdoSessionStorage来实现的。官方文档介绍了如何设置会话存储来做到这一点。
如果上述所有操作均正确,您应该无法登录 dev.site.com 上的安全区域,然后将 URL 更改为 poll.dev.site.com 上的其他安全区域,而无需再次提供登录凭据。请注意,用户凭据仅加载到安全区域中。
当它可以直接在浏览器中打开 poll.dev.site.com 时,需要再次输入凭据。您需要做一些额外的工作才能使 Ajax 请求正常工作。
根据这两个问题:Setting a cookie on a subdomain from an ajax request、multi-sub-domain cookies and ajax issues问题可能是http://en.wikipedia.org/wiki/Same_origin_policy。
第一个建议在 dev.site.com 上设置以下标头字段:
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: http://poll.dev.site.com
Run Code Online (Sandbox Code Playgroud)
然后在 ajax 请求上传递withCredentials 。
$.ajax({
url: 'http://poll.dev.site.com/some/ajax/endpoint.json',
xhrFields: {
withCredentials: true
}
});
Run Code Online (Sandbox Code Playgroud)
我已经使用一个虚拟文件对其进行了测试,该文件仅设置 cookie 并尝试使用 ajax 请求。如果我在 ajax 请求上使用了withCredentials ,我就可以使用它,但是当我尝试使用/不使用 Access-Control-Allow-* 标头时,我看不到任何差异。
另一个答案建议使用 document.domain 但我没有对此进行测试。
我在测试时使用 Opera 的 Dragonfly 来检查 Cookie 标头是否发送到服务器的网络流量。您也可以使用 Firebug、Chrome 或 IE。
| 归档时间: |
|
| 查看次数: |
2479 次 |
| 最近记录: |