rails应用程序中的Cookie溢出?

ero*_*gol 103 ruby-on-rails

UsersController中的ActionDispatch :: Cookies :: CookieOverflow #create

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

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
Run Code Online (Sandbox Code Playgroud)

AMI*_*ING 152

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

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

这样CookieOverflow就会发生此错误.

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

这是步骤

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

    rake db:sessions:create
    
    Run Code Online (Sandbox Code Playgroud)
  2. 运行迁移

    rake db:migrate
    
    Run Code Online (Sandbox Code Playgroud)
  3. 修改config/initializers/session_store.rb

    (App)::Application.config.session_store :cookie_store, :key => 'xxx'
    
    Run Code Online (Sandbox Code Playgroud)

    (App)::Application.config.session_store :active_record_store
    
    Run Code Online (Sandbox Code Playgroud)

完成这三个步骤后,重新启动应用程序.Rails现在将使用会话表来存储会话数据,并且您将没有4kb的限制.

  • 是否可以通过查看 cookie 来检查这一点 (2认同)

Alt*_*gos 76

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

gem 'activerecord-session_store'
Run Code Online (Sandbox Code Playgroud)

然后运行迁移生成器:

rails generate active_record:session_migration
rake db:migrate
Run Code Online (Sandbox Code Playgroud)

最后将会话存储设置为config/initializers/session_store.rb:

Rails.application.config.session_store :active_record_store, :key => '_my_app_session'
Run Code Online (Sandbox Code Playgroud)

更新:

如果有人null value in column "session_id" violates not-null constraint在rails 4中收到消息,那么在github中有一个解决方法(未经测试).您必须使用创建初始化程序ActiveRecord::SessionStore::Session.attr_accessible :data, :session_id

  • 运行"rails generate active_record:session_migration"之后别忘了运行:"rake db:migrate"! (2认同)
  • 如果我不想在DB中存储任何内容我怎么能解决错误怎么办?我在ApplicationController中尝试了rescue_from ActionDispatch :: Cookies :: CookieOverflow,:with =>:render_404但它没有工作 (2认同)

My *_*God 10

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

您的会话(默认情况下在cookie中)需要移动到Active Record store或memcache store来解决此问题.

对于数据库会话:

config.action_controller.session_store = :active_record_store
Run Code Online (Sandbox Code Playgroud)

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

rake db:sessions:create
rake db:migrate
Run Code Online (Sandbox Code Playgroud)

要么

对于Memcache会话:

config.action_controller.session_store = :mem_cache_store
Run Code Online (Sandbox Code Playgroud)

您还需要设置mem缓存服务器并将其配置如下:

config.cache_store = :mem_cache_store, 'localhost', '127.0.0.1:11211',
{:namespace => 'myapp123'}
Run Code Online (Sandbox Code Playgroud)


Zac*_* Xu 9

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

看看关于这个主题的这个railscast:http://railscasts.com/episodes/13-dangers-of-model-in-session?autoplay = true

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

(见上文Frederick Cheung的评论).


Dav*_*mpy 8

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

  • 这也是导致错误的原因.将过多数据放入Flash消息中. (2认同)

cia*_*mce 7

该错误是因为您正在尝试序列化用户模型在 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
Run Code Online (Sandbox Code Playgroud)