为什么Rails的无法访问会话中从Internet Explorer一个Ajax请求? [英] Why does Rails Fail to access the Session in an Ajax request from Internet Explorer?

查看:160
本文介绍了为什么Rails的无法访问会话中从Internet Explorer一个Ajax请求?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在我的sessions_helper以下code:

 高清CURRENT_USER
   @current_user || = User.find_by_remember_token(饼干[:remember_token])
 结束
 

这让我们从任何控制器我叫CURRENT_USER获取当前用户。 (我使用的是从零开始类似 Railstutorial的 Railscasts )。

我有Ajax请求名为 lookup_result ,检查服务器,以查看是否有具体的结果已就绪。

  $。获得(/ lookup_result ID =<%= ID%>中);
 

它去下面的控制器方法:

 高清查找结果
  用户= CURRENT_USER
  #做事用户...
结束
 

这通常工作正常,但有时Rails的失败,以获得CURRENT_USER。我怀疑的问题是,Cookie或CSRF令牌失败,通过在一些场合Ajax请求获得通过,但为什么它通常工作?如何解决它,所以它始终工作?

更新:
我不知道如何复制错误。只有登录的用户都能够访问发送一个请求(尽管有人可以复制Ajax请求到未签署其他浏览器)的页面。我举报翻车错误并保存请求数据。

这是对用户代理通常的数据时,CURRENT_USER失败:

  

的Mozilla / 4.0(兼容; MSIE 7.0; Windows NT的5.1; InfoPath.1; ......)

这意味着有一些问题与Internet Explorer发送过阿贾克斯的会话信息。任何人都知道如何解决这个问题?

下面你可以看到所有的数据类别返回,但它是空与会话的任何东西。

  

时间戳
  message.request_data.headers.Accept
  message.request_data.headers.Accept-编码
  message.request_data.headers.Accept语言
  message.request_data.headers.Cf-连接-IP //(CF代表的CloudFlare)
  message.request_data.headers.Cf-Ipcountry
  message.request_data.headers.Cf射线
  message.request_data.headers.Cf,游客
  message.request_data.headers.Connection
  message.request_data.headers.Host
  message.request_data.headers.User代理
  message.request_data.headers.Version
  message.request_data.headers.X - 转发,对于
  message.request_data.headers.X - 转发,端口
  message.request_data.headers.X - 转发,原
  message.request_data.headers.X请求开始
  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

解决方案

这似乎主要是与Internet Explorer的一个问题。据计算器上其他的答案,IE并不擅长传球会议上的信息,如果该URL有下划线的吧!我要改变网址,看看有没有什么帮助解决问题。 (虽然下划线不在域名。)

<一个href="http://stackoverflow.com/questions/13350652/no-session-cookies-on-internet-explorer-9-ajax-requests">No会话Cookie在Internet Explorer 9 AJAX请求
<一href="http://stackoverflow.com/questions/794243/internet-explorer-ignores-cookies-on-some-domains-cannot-read-or-set-cookies">Internet资源管理器会忽略一些领域饼干(无法读取或设置Cookie)

(更新:尚不清楚,如果这有助于)

I have the following code in my sessions_helper:

 def current_user
   @current_user ||= User.find_by_remember_token(cookies[:remember_token])
 end

This let's me call current_user from any controller to get the current User. (I'm using authentication from scratch similar to Railstutorial's or Railscasts).

I have ajax request called lookup_result that checks the server to see if a specific result is ready.

 $.get("/lookup_result?id=<%=id%>");

It goes to the following controller method:

def lookup result
  user = current_user 
  # do things with user...
end

This usually works fine, but sometimes Rails fails to get the current_user. I suspect the problem is that the cookies or CSRF token fail to get passed through the ajax request on some occasions, but why does it usually work? How do I fix it so it always works?

Update:
I don't know how to replicate the error. Only signed-in users are able to access the page that sends that request (though someone could copy the ajax request into another browser that isn't signed in). I report the error with rollbar and save the request data.

This is the usual data for user-agent when current_user fails:

Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; InfoPath.1; ... )

This implies there's some issue with Internet Explorer sending the session info over Ajax. Anyone know how to fix this?

Below you can see all the data categories it returns, though it's empty for anything with "session" in it.

Timestamp
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 stands for 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.... //(various parameters are displayed)
...
message.request_data.session.defer //(all these session items are empty)
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

解决方案

It seems to be mainly a problem with Internet Explorer. According to other answers on StackOverflow, IE isn't good at passing session info if the URL has underscores in it! I'm going to change the URLs and see if that helps solve the problem. (Though the underscore was not in the domain name.)

No Session Cookies on Internet Explorer 9 AJAX requests
Internet Explorer ignores cookies on some domains (cannot read or set cookies)

(Update: Not clear if that helped.)

这篇关于为什么Rails的无法访问会话中从Internet Explorer一个Ajax请求?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆