2011-05-19 87 views
0

我有一个表格,提交时,它会调用一个jQuery阿贾克斯要求如:发帖形成,说用户没有登录,会话cookie存在

$.ajax({ 
type:"POST", 
url: "/posts/" + id + "/add_comment", 
.. 
.. 
}); 

这个网站有子域,以及登录后会话cookie的样子:

name: __webt_session 
value: ... 
host: testsubdomain.lvh.me 
path:/
Secure: No 
Expires: At end of session 

现在,当我提交意见,它不保存注释,而它重定向到登录页面(html的是登录页面,它不” actaully重定向b/c这是幕后的ajax调用)。

我的表单操作的url是否必须包含子域?

BTW,为什么它说“安全:NO”

UPDATE

我设置了帖子的网址,包括完整的URL瓦特/子域,它仍然重定向到登录页面。 为什么不拾起cookie?

当我在发布表单的页面上时,我登录得很好。该网址中包含子网域。当我张贴到页面时,出于某种原因,它认为我没有登录并重定向我(您必须登录才能发表评论)。非常困惑,为什么它不拾取cookie。

想法?

+1

如果一个cookie被设置为“安全”,比它只会通过HTTPS来传输(不通过HTTP) – Claudio 2011-05-19 21:44:08

+0

我看到好,感谢该名称。 – Blankman 2011-05-19 21:48:56

+0

您使用哪个认证库?那个库和rails的哪个版本? – andrewmitchell 2011-05-19 22:05:43

回答

1

确保您的文章有轨authenticity_token如果您的控制器的动作有protect_from_forgery

在轨3.0.x的(X> 3)如果verify_authenticity_token失败,它记录你出去,所以你的身份验证将失败。

UPDATE

要在你的JavaScript后做到这一点,你要添加一个名为authenticity_token后的参数。此参数的值可以通过两种方式确定:

1)在您的控制器调用form_authenticity_token并将此值传递给javascript。

2)在你的布局,加入这一行

<%= csrf_meta_tag %> 

这将以下内容添加到您的文档的头部

<meta name="csrf-param" content="authenticity_token"/> 
<meta name="csrf-token" content="Sm8z1XLTzI5HCy7+MIB+yFXiGUdS1byUHI8brHknirY="/> 

你可以用这样一个小的JavaScript retrive的岗位价值:

document.getElementsByName('csrf-token')[0].content 

在此版本中,您可以超级正确并使用值为

document.getElementsByName('csrf-param')[0].content 

确定之后的参数

+0

啊,谢谢我希望这是它!由于这是一个ajax调用,我必须以某种方式手动将它添加到我的.js文件中,然后将它作为参数传递给.ajax调用。 – Blankman 2011-05-19 22:10:52

+0

如何从控制器内访问令牌? – Blankman 2011-05-19 22:16:55

+0

邮票前面应该放置什么? .js的代码片段似乎正在修改其他内置导轨的其他内容,我的是自定义的。 – Blankman 2011-05-19 22:19:22