คุกกี้ล้นในแอปพลิเคชั่นราง?


106

ActionDispatch :: คุกกี้ :: 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

1
ข้อผิดพลาดนี้เกิดขึ้นเมื่อคุณมีข้อมูล / วัตถุขนาดใหญ่ในเซสชัน คุณแชร์โค้ดเพื่อสร้างการดำเนินการในคอนโทรลเลอร์ได้ไหม
เรนทร์สีโสดิยา


3
แม้ว่าคำตอบเกี่ยวกับการเปลี่ยนที่เก็บเซสชันของคุณจะถูกต้อง แต่ฉันก็สงสัยว่าทำไมคุณถึงต้องการเก็บผู้ใช้ทั้งหมดไว้ในเซสชัน หากคุณต้องเก็บของบางอย่างให้เก็บ user_id (แม้ว่าจะมีอยู่ในคุกกี้ของคุณแล้วก็ตาม)
Frederick Cheung

เพียงไปที่ที่เก็บแคชของเบราว์เซอร์และล้างคุกกี้ที่เป็นของ URL ของเว็บไซต์นั้น ๆ สำหรับฉันมันเกิดขึ้นส่วนใหญ่ใน localhost
เบ็น

ฉันได้สร้างโมเดลผู้ใช้ด้วยDeviseและฉันไม่ได้รีสตาร์ทเซิร์ฟเวอร์การพัฒนาของฉันหลังจากเรียกใช้การย้ายข้อมูล เมื่อฉันทำข้อผิดพลาดก็หยุดลง
wuliwong

คำตอบ:


159

คุณมีขีด จำกัด 4kb สำหรับสิ่งที่คุณสามารถจัดเก็บในคุกกี้และเมื่อ Rails แปลงวัตถุของคุณเป็นข้อความสำหรับการเขียนไปยังคุกกี้อาจมีขนาดใหญ่กว่าขีด จำกัด นั้น

ActionDispatch::Cookies::CookieOverflowข้อผิดพลาดRuby on Rails

วิธีนี้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


1
เป็นไปได้ไหมที่จะเห็นว่าคุกกี้ตรวจสอบนี้
erogol

แค่อยากรู้ - นี่คือขีด จำกัด 4kb ต่อเซสชันหรือต่อแอพ?
colllin

1
@colllin มันต่อเซสชั่น
Alex D

ฉันต้องการactive_record_storeอัญมณีไหม
Saad Masood

หรือเป็นส่วนหนึ่งของราง 4
Saad Masood

78

เพื่อให้:active_record_storeฟังก์ชันทำงานใน Rails 4/5 คุณต้องเพิ่มอัญมณีactiverecord-session_storeของคุณ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ข้อความในราง 4 แสดงว่ามีไฟล์วิธีแก้ปัญหาใน github (ไม่ได้ทดสอบ) คุณต้องสร้างตัวเริ่มต้นด้วยActiveRecord::SessionStore::Session.attr_accessible :data, :session_id


คุณไม่ได้รับข้อผิดพลาดเมื่อใช้อัญมณีนี้หรือไม่? ฉันได้รับสิ่งต่อไปนี้:ERROR: null value in column "session_id" violates not-null constraint
ปีเตอร์

@ ปีเตอร์มันไม่ได้เกิดขึ้นกับฉัน แต่ที่นี่ยังคงเป็นปัญหาที่เปิดอยู่ คำแนะนำเดียวของฉันคือเขียนความคิดเห็นในปัญหานั้นเพื่อดูจนกว่าจะมีคนแก้ไข ขออภัย: /
Alter Lagos

@ ปีเตอร์ฉันไม่แน่ใจว่าสายเกินไปหรือเปล่า แต่ตรวจสอบคำตอบที่อัปเดตของฉัน
Alter Lagos

2
หลังจากเรียกใช้ "รางสร้าง active_record: session_migration" อย่าลืมเรียกใช้: "rake db: migrate"!
Patrice Gagnon

2
จะเกิดอะไรขึ้นถ้าฉันไม่ต้องการจัดเก็บสิ่งใด ๆ ในฐานข้อมูลฉันจะแก้ไขข้อผิดพลาดได้อย่างไร ฉันลอง Rescue_from ActionDispatch :: Cookies :: CookieOverflow,: with =>: render_404 ใน ApplicationController แต่ไม่ได้ผล
nisevi

14

หากคุณเห็นสิ่งนี้ให้ตรวจสอบว่าคุณไม่ได้ทำให้ข้อมูลเซสชันบางส่วนเสียไป ในกรณีของฉันมันเป็นข้อความเดียวกันหลายพันข้อความที่สูบเข้าไปในข้อความแฟลช แค่พูด.

ฉันจะเพิ่มว่าถ้าคุณคิดว่าวิธีแก้ปัญหาคือทำให้ที่เก็บคุกกี้ของคุณใหญ่ขึ้น (เนื่องจากที่อยู่คำตอบอื่น ๆ ส่วนใหญ่) คุณอาจจะคิดใหม่ได้ดีกว่าว่าคุณใส่คุกกี้อะไรลงไป หากคุณต้องการโทเค็นการตรวจสอบสิทธิ์รหัสเซสชันและคุกกี้เค้าโครง / การติดตามมากกว่าสองสามรายการแสดงว่าคุณอาศัยอยู่ในยุค 90


1
ฉันกำลังรวมพารามิเตอร์บางอย่างเข้าด้วยกันเพื่อรักษาสถานะ!
Anwar

2
นี่เป็นสาเหตุของข้อผิดพลาดสำหรับฉันเช่นกัน ใส่ข้อมูลมากเกินไปในข้อความแฟลช
knubie

10

ไม่ควรจัดเก็บโมเดลออบเจ็กต์ในเซสชัน

ลองดู railscast ในหัวข้อนี้: http://railscasts.com/episodes/13-dangers-of-model-in-session?autoplay=true

แนวทางปฏิบัติที่ดีกว่าในการจัดเก็บ id (id ของผู้ใช้ในกรณีนี้) ไว้ในเซสชัน แล้วคุณจะไม่มีปัญหานี้.

(ดูความคิดเห็นของ Frederick Cheung ด้านบนด้วย)


9

ข้อความแสดงข้อผิดพลาดระบุปัญหาอย่างชัดเจนเกี่ยวกับขนาดที่เก็บคุกกี้ที่ล้น

เซสชันของคุณ (โดยค่าเริ่มต้นในคุกกี้) ต้องถูกย้ายไปที่ Active record store หรือ memcache store เพื่อแก้ไขปัญหานี้

สำหรับเซสชัน Databased:

config.action_controller.session_store = :active_record_store

คุณต้องสร้างตารางเซสชันดังต่อไปนี้

rake db:sessions:create
rake db:migrate

หรือ

สำหรับเซสชัน Memcache:

config.action_controller.session_store = :mem_cache_store

นอกจากนี้คุณต้องตั้งค่าเซิร์ฟเวอร์ mem cache และกำหนดค่าดังต่อไปนี้:

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

6

ข้อผิดพลาดนั้นเป็นเพราะคุณกำลังพยายามทำให้เป็นอนุกรมโมเดลผู้ใช้เมื่อจัดเก็บวัตถุในคุกกี้ทางรถไฟจะใช้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

1

ข้อผิดพลาดนี้ปรากฏสำหรับฉันเมื่อฉันกำลังเรียกใช้ข้อมูลจำเพาะ หลังจากอัปเดต Capybara จาก 1.x เป็น 2.x เพียงแค่คราด tmp: ล้างแก้ไขได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.