簡體   English   中英

Rails 應用程序中的 Cookie 溢出?

[英]Cookie overflow in rails application?

ActionDispatch::Cookies::CookieOverflow 在 UsersController#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

您可以在 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

完成這三個步驟后,重新啟動應用程序。 Rails 現在將使用會話表來存儲會話數據,您將沒有 4kb 的限制。

要使: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'

更新:

如果有人null value in column "session_id" violates not-null constraint收到null value in column "session_id" violates not-null constraint了 rails 4 中的null value in column "session_id" violates not-null constraint消息,則github 中有一個解決方法(未測試)。 您必須使用ActiveRecord::SessionStore::Session.attr_accessible :data, :session_id創建初始值設定項

如果您看到這一點,請檢查您沒有破壞某些會話數據。 就我而言,它是將數千條相同的消息注入到閃現消息中。 就是說。

我要補充一點,如果您認為解決方案是讓您的 cookie 存儲更大(正如大多數其他答案所解決的那樣),那么您最好重新考慮一下您實際放入 cookie 的內容。 如果您需要多個身份驗證令牌、會話 ID 以及一些布局/跟蹤 cookie,那么您就生活在 90 年代。

在會話中存儲模型對象不是一個好主意。

查看有關此主題的 Railscast: http ://railscasts.com/episodes/13-dangers-of-model-in-session?autoplay=true

將 id(在本例中為用戶的 id)存儲在會話中是一種更好的做法。 那你就不會有這個問題了。

(另請參閱上面的 Frederick Cheung 評論)。

錯誤消息清楚地表明溢出的 cookie 存儲大小問題。

您的會話(默認在 cookie 中)需要移動到 Active record store 或 memcache store 以解決此問題。

對於數據庫會話:

config.action_controller.session_store = :active_record_store

您需要創建會話表如下

rake db:sessions:create
rake db:migrate

或者

對於 Memcache 會話:

config.action_controller.session_store = :mem_cache_store

您還需要設置一個內存緩存服務器並將其配置如下:

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

該錯誤是因為您正在嘗試序列化用戶模型在 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

當我運行規范時,這個錯誤出現在我身上。 將 Capybara 從 1.x 更新到 2.x 后。 只是 rake tmp:clear 解決了它。

我的問題是因為代碼

rescue StandardError => e
  flash[:error] = "Error was #{error.message}"
end

error.message太大

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM