我有一个表单,在提交时,它调用jquery .ajax请求,如:
$.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用于登录页面,它不会'动作重定向b / c它是幕后的ajax调用)。
我的表单操作网址是否必须包含子域名?
顺便说一下,为什么会说'安全:不'更新
我将post url设置为包含w / subdomain的完整url,并且仍然会重定向到登录页面。 为什么不拿起cookie?
当我在发布表单的页面上时,我已经登录了。该网址中包含多个子网域。必须是当我发布到页面时,出于某种原因,它认为我没有登录并重定向我(你必须登录才能发表评论)。很困惑,为什么它没有拿起饼干。
想法?
答案 0 :(得分:1)
如果您的控制器操作有authenticity_token
protect_from_forgery
在rails 3.0.x(x> 3)中如果verify_authenticity_token
失败,它会将您注销,因此您的身份验证将失败。
<强>更新强>
要在您的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来检索帖子值:
document.getElementsByName('csrf-token')[0].content
在此版本中,您可以更正确并使用
的值document.getElementsByName('csrf-param')[0].content
确定post参数的名称