Rails 4外部重定向和会话问题



我试图在Rails 4中建立一个网站,以跟踪用户重定向和网站元素视图。

我决定使用会话id,我相信在短期内是相当独特的,但我有一个奇怪的问题。

示例程序:

  1. 用户遵循重定向,系统将此操作与会话ID一起存储,例如xxx
  2. 用户到达目标页面,其中包含一个跟踪器,系统将此操作与另一个会话ID yyy保存,
  3. 用户到达另一个包含跟踪器的页面,系统将此动作保存为会话ID yyy

在存储第二个操作之后,会话ID在此之后的每个请求保持相同的yyy,但我需要每次都具有相同的会话ID。

在会话中,我还存储了一个SecureRandom。hex生成的代码,从第一个请求到第二个请求也会改变(这并不奇怪,因为会话ID会改变)。

我也试过使用cookie,结果相同。

请注意,这些重定向是外部的,但所有的请求都是向相同的域(完全相同,没有www和https)。

任何想法?

提前感谢。

更新

是负责管理重定向的源代码:

before_action :load_redirect, :only => [:http_redirect]
def http_redirect
  raise ActionController::RoutingError.new('Redirect has been disabled') unless @redir.enabled
  ua = UserAction.create(
    :session_id => session.id,
    :user_agent => request.user_agent,
    :trackable => @redir,
    :ip_address => request.remote_ip,
    :referer => request.referer
  )
  redirect_to @redir.destination_url
end
private
  def load_redirect
    @redir = Redirect.find(params[:id])
  end

UPDATE:

由于您正在使用iframe(按下面的评论讨论)跟踪代码,问题很可能是在外部站点cookie不被传递从父页到iframe,因为iframe的起源(域)是不同于父页。

老回答:(仍然可以帮助其他人调试类似的问题)

源代码会有帮助。如果没有,可以尝试以下几种方法:

  1. 尝试禁用CSRF保护用于外部跟踪链接动作(我假设它来自外部来源的POSTs或PUTs数据)。CSRF保护可以为这些请求创建一个新会话或空会话。将其放入包含从外部源接收数据的动作的控制器中:

    protect_from_forgery :except => [:your_action]
    
  2. 重定向(特别是如果它是301)可以缓存在您正在使用的浏览器中,因此具有与您的跟踪代码请求不同的cookie和会话。过期的cookie将成为缓存重定向的一部分。

    尝试将缓存控制头放在执行重定向的控制器操作上。

    response.headers['Cache-Control'] = 'no-cache, no-store, must-revalidate'
    response.headers['Pragma'] = 'no-cache'
    response.headers['Expires'] = '0'
    
  3. 您的浏览器可能不支持在重定向上设置cookie,或者可能不支持第三方cookie。尝试使用不同的现代浏览器?

  4. 您的代码中可能有错误。如果这些解决方案不起作用,也许发布它?

最新更新