我的 session_helper 中有以下代码:
def current_user
@current_user ||= User.find_by_remember_token(cookies[:remember_token])
end
这让我从任何控制器调用 current_user 来获取当前用户。(我从头开始使用类似于Railstutorial或Railscasts的身份验证)。
我调用了 ajax 请求lookup_result
来检查服务器以查看特定结果是否已准备好。
$.get("/lookup_result?id=<%=id%>");
它转到以下控制器方法:
def lookup result
user = current_user
# do things with user...
end
这通常可以正常工作,但有时 Rails 无法获取 current_user。我怀疑问题是cookie或CSRF令牌在某些情况下无法通过ajax请求,但为什么它通常会起作用?如何修复它以使其始终有效?
更新:
我不知道如何复制错误。只有登录的用户才能访问发送该请求的页面(尽管有人可以将 ajax 请求复制到另一个未登录的浏览器中)。我用 rollbar 报告错误并保存请求数据。
这是 current_user 失败时用户代理的常用数据:
Mozilla/4.0(兼容;MSIE 7.0;Windows NT 5.1;InfoPath.1;...)
这意味着 Internet Explorer 通过 Ajax 发送会话信息存在一些问题。有人知道怎么修这个东西吗?
您可以在下面看到它返回的所有数据类别,尽管其中包含“会话”的任何内容都是空的。
时间戳
message.request_data.headers.Accept
message.request_data.headers.Accept-Encoding
message.request_data.headers.Accept-Language
message.request_data.headers.Cf-Connecting-Ip //(CF代表cloudflare)
message.request_data.headers .Cf-Ipcountry
message.request_data.headers.Cf-Ray
message.request_data.headers.Cf-Visitor
message.request_data.headers.Connection
message.request_data.headers.Host
message.request_data.headers.User-Agent
message.request_data.headers .Version
message.request_data.headers.X-Forwarded-For
message.request_data.headers.X-Forwarded-Port
message.request_data.headers.X-Forwarded-Proto
message.request_data.headers.X-Request-Start
message.request_data.method
message.request_data.params.... //(显示各种参数)
...
message.request_data.session.defer //(所有这些会话项为空)
message.request_data.session.domain
message.request_data.session.expire_after
message.request_data.session.httponly
message.request_data.session.id
message.request_data.session.path
message.request_data.session.renew
message.request_data.session .secret
message.request_data.session.secure
message.request_data.url
message.request_data.user_ip
server.host