【发布时间】:2013-03-20 17:06:13
【问题描述】:
在我的 Rails + Devise 应用程序中,我有一个指向多个“联系人”的链接表,每个都是一个简单的 jquery $.get AJAX 请求,它调用 Contact#show。
在点击 3-25 个链接中的任意位置(成功!)后,请求将不可避免地失败(响应状态为 0 或加载资源失败,具体取决于浏览器),之后它将永远无法再次工作,直到浏览器选项卡关闭或缓存被清除。
这是请求的 javascript
$.get('/contacts/1312')
详情...
- 我的布局顶部确实有 csrf_meta_tags
- 请求头确实包含一个“X-CSRF-Token”,其中包含来自元标记的正确 CSRF 令牌
- 在 chrome 上,失败的请求不会显示在服务器日志中 作为请求。就好像他们从未成功过一样。报告的唯一错误 在报告失败的 chrome 控制台中。这让我相信它与浏览器有关。
- 在 Safari 上,第一次失败时,它似乎会破坏会话,任何后续请求都会导致对登录页面的请求,这让我相信它可能与设计有关
2013 年 3 月 30 日更新:在查看了许多关于 SO(这个:Rails not reloading session on ajax post)的相关问题后,这些问题与 CSRF 设置不正确有关,我不认为这个问题与 CSRF 有关,因为在失败之前它可以正常工作几次。
【问题讨论】:
-
在某处看起来像是一个奇怪的边缘案例。也许对该 .get() 请求使用错误回调并执行 console.log 之类的。
.fail(function() { alert("error"); }) .always(function() { alert("finished"); }); -
@PhuPhan,谢谢,关于我可以通过控制台注销以获取有关为什么会发生这种情况的更多详细信息的任何想法?触发第一次失败的接触之间似乎没有可辨别的模式。
-
我会调查时间敏感的事情,比如服务器丢弃的空闲连接?或安全令牌。就像您的安全服务踢出空闲用户一样?因为 AJAX 可能不能算作使您的连接保持活跃的实际操作。我相信 fail() 和 always() 函数有一个可以打印出来的参数。让我去看看。
error Type: Function( jqXHR jqXHR, String textStatus, String errorThrown )所以尝试使用 console.log() 打印出 errorThrown 和 textStatus。 -
@AustinWang 你找出问题所在了吗?我也有类似的问题。
-
@ayls,是的,我最终弄明白了。我正在使用将其状态保存在 cookie 中的功能 datatables.js(一个表库)。然而,它试图保存在 cookie 中的数据超过了 4kb 的最大值,所以我的 cookie 被弄乱了,导致不同浏览器的行为不同。我建议您查看是否有任何东西弄乱了您的 cookie,以及是否是导致问题的原因。
标签: ruby-on-rails ajax jquery devise csrf