rails应用程序中的Cookie溢出?

时间:2012-02-27 23:06:05

标签: ruby-on-rails

  

在UsersController #create

中的ActionDispatch :: Cookies :: CookieOverflow

我尝试打开页面时出现此错误。我不知道如何调试此错误。你对这个问题有什么建议吗?

def create
  @user = User.new(params[:user])
  sign_in @user

  if @user.save
    @user.folders.create(:folder_name=>"Default Folder", :user_id=>@user.id)
    flash[:success] = "Welcome to Bunch<it>! "
    redirect_to @user
  else
    @title = "Sign up"
    render 'new'
  end
end


def sign_in(user)
  cookies.permanent.signed[:remember_token] = [user.id, user.salt]
  session[:current_user] = user
  current_user = user
end

7 个答案:

答案 0 :(得分:150)

你对cookie中存储的内容有4kb的限制,当Rails将你的对象转换为文本以写入cookie时,它可能大于该限制。

Ruby on Rails ActionDispatch::Cookies::CookieOverflow错误

这样会发生CookieOverflow错误。

解决这个问题的最简单方法是,您需要更改session_store并且不要使用cookie_store。您可以使用active_record_store示例。

以下是步骤

  1. 生成创建会话表的迁移

    rake db:sessions:create
    
  2. 运行迁移

    rake db:migrate
    
  3. 修改config/initializers/session_store.rb
    (App)::Application.config.session_store :cookie_store, :key => 'xxx'
    

    (App)::Application.config.session_store :active_record_store
    
  4. 完成这三个步骤后,请重新启动应用程序。 Rails现在将使用sessions表来存储会话数据, 你不会有4kb的限制。

答案 1 :(得分:71)

要使:active_record_store功能在Rails 4/5中有效,您必须将activerecord-session_store gem添加到Gemfile

gem 'activerecord-session_store'

然后运行迁移生成器:

rails generate active_record:session_migration
rake db:migrate

最后在config/initializers/session_store.rb中设置会话商店:

Rails.application.config.session_store :active_record_store, :key => '_my_app_session'

更新:

如果有人在rails 4中收到null value in column "session_id" violates not-null constraint消息,则会有workaround in github(未经过测试)。您必须使用ActiveRecord::SessionStore::Session.attr_accessible :data, :session_id

创建初始值设定项

答案 2 :(得分:10)

错误消息清楚地表明cookie存储大小溢出的问题。

您的会话(默认情况下在Cookie中)需要移至Active记录 存储或memcache存储来解决此问题。

对于数据库会话:

config.action_controller.session_store = :active_record_store

您需要创建会话表,如下所示

rake db:sessions:create
rake db:migrate

OR

对于Memcache会话:

config.action_controller.session_store = :mem_cache_store

您还需要设置mem缓存服务器并按如下所示进行配置:

config.cache_store = :mem_cache_store, 'localhost', '127.0.0.1:11211',
{:namespace => 'myapp123'}

答案 3 :(得分:9)

在会话中存储模型对象不是一个好主意。

在此主题上查看此railscast: http://railscasts.com/episodes/13-dangers-of-model-in-session?autoplay=true

在会话中存储id(在这种情况下是用户的id)是一种更好的做法。 那你就不会有这个问题了。

(见上文Frederick Cheung的评论)。

答案 4 :(得分:7)

如果你看到这个,请检查你是否没有炸毁一些会话数据。就我而言,闪存消息中输入了数千条相同的消息。只是说。

答案 5 :(得分:2)

该错误是因为您正在尝试序列化用户模型 在将对象存储在cookie中时,rails将使用Marshal.dump,因为这是用户记录中的所有内容,因此会产生大量内容

与其使用session[:current_user] = user存储实际用户记录,不如尝试仅存储用户ID,然后提供一种方法,可以从中查找用户 例如

def sign_in(user)
  ...
  session[:current_user_id] = user.id
end

def current_user
  @current_user ||= User.find(session[:current_user_id])
end

答案 6 :(得分:1)

当我运行规格时,这个错误出现了。将Capybara从1.x更新为2.x. 只是耙tmp:清楚解决了它。