Cookies with Rails
Bài đăng này đã không được cập nhật trong 3 năm
Cookies
Với một cookie, bạn có thể lưu trữ thông tin trên hệ thống của trình duyệt web dưới dạng các chuỗi như cặp key-value mà web server đã gửi trước đó đến trình duyệt này. Thông tin sau đó được gửi lại từ trình duyệt đến máy chủ trong HTTP header. Cookie (nếu được định cấu hình phù hợp) sẽ bị xóa khỏi hệ thống trình duyệt bằng cách khởi động lại trình duyệt cũng như khởi động lại toàn bộ hệ thống. Tất nhiên, người dùng của trình duyệt có thể tự xóa cookie.
Rails cung cấp một hash với tên là cookies[]
.
Để chứng minh làm thế nào cookie hoạt động, chúng ta sẽ xây dựng một ứng dụng Rails đặt một cookie trên một trang, đọc nó trên một trang khác và hiển thị nội dung, và cookie bị xóa trên trang thứ ba.
rails new cookie_jar
cd cookie_jar
rails generate controller Home set_cookies show_cookies delete_cookies
File controller app/controllers/home_controller.rb
như sau:
class HomeController < ApplicationController
def set_cookies
cookies[:user_name] = "Horst Meier"
cookies[:customer_number] = "1234567890"
end
def show_cookies
@user_name = cookies[:user_name]
@customer_number = cookies[:customer_number]
end
def delete_cookies
cookies.delete :user_name
cookies.delete :customer_number
end
end
Và file view app/views/home/show_cookies.html.erb
như sau:
<table>
<tr><td>User Name:</td><td><%= @user_name %></td></tr>
<tr><td>Customer Number:</td><td><%= @customer_number %></td></tr>
</table>
Khởi động Rails server và đi đến url http://0.0.0.0:3000/home/show_cookies trong trình duyệt của bạn. Bạn sẽ không nhìn thấy bất kỳ giá trị nào.
Bây giờ hãy đi đến url http://0.0.0.0:3000/home/set_cookies và sau đó quay lại http://0.0.0.0:3000/home/show_cookies. Bạn sẽ thấy các giá trị mà chúng ta đã set trong method set_cookies
.
Bằng cách try cập trang http://0.0.0.0:3000/home/delete_cookies bạn có thể delete các cookie.
Permanent Cookies
Cookie thường được set để cung cấp cho ứng dụng một cách để nhận dạng người dùng khi họ ghé thăm lại sau. Giữa những lần truy cập vào trang web này, có thể kéo dài nhiều thời gian và người dùng cũng có thể đóng trình duyệt trong thời gian chờ đợi. Để lưu trữ các cookie lâu hơn phiên trình duyệt hiện tại, bạn có thể sử dụng phương thức permanent
. Thêm phương thức này vào trong app/controllers/home_controller.rb
:
class HomeController < ApplicationController
def set_cookies
cookies.permanent[:user_name] = "Horst Meier"
cookies.permanent[:customer_number] = "1234567890"
end
def show_cookies
@user_name = cookies[:user_name]
@customer_number = cookies[:customer_number]
end
def delete_cookies
cookies.delete :user_name
cookies.delete :customer_number
end
def debug_cookies
end
end
Signed Cookies
Với cookie thông thường được đặt, bạn không có tùy chọn ở phía ứng dụng để tìm hiểu xem người dùng ứng dụng đã thay đổi cookie. Điều này có thể nhanh chóng dẫn đến các vấn đề bảo mật, vì việc thay đổi nội dung của một cookie trong trình duyệt không phải là khó. Giải pháp là đăng ký các cookie với một key chỉ được biết với chúng ta. Key này được tạo tự động thông qua một máy phát ngẫu nhiên với mỗi rails new và nằm trong file config/initializers/secret_token.rb
:
# Be sure to restart your server when you modify this file.
# Your secret key for verifying the integrity of signed cookies.
# If you change this key, all old signed cookies will become invalid!
# Make sure the secret is at least 30 characters and all random,
# no regular words or you'll be exposed to dictionary attacks.
CookieJar::Application.config.secret_token = '85ec33910d4d57f3d3c69cb8fef20f158f68a219a76db71280779454a523330874fc4e42c7e62ecb25b8e4f5fcce1dcad88c7dcc9671a9922f675d770270a25a'
Sử dụng phương thức signed
. Bạn phải sử dụng nó để viết và đọc cookie. Thêm phương thức này vào trong app/controllers/home_controller.rb
:
class HomeController < ApplicationController
def set_cookies
cookies.permanent.signed[:user_name] = "Horst Meier"
cookies.permanent.signed[:customer_number] = "1234567890"
end
def show_cookies
@user_name = cookies.signed[:user_name]
@customer_number = cookies.signed[:customer_number]
end
def delete_cookies
cookies.delete :user_name
cookies.delete :customer_number
end
def debug_cookies
end
end
Nội dung của cookie được lưu ở dạng mã hoá mỗi lần bạn thiết lập cookie. Tên của cookie vẫn có thể được người dùng đọc, nhưng không phải là giá trị.
Tham khảo
http://www.xyzpub.com/en/ruby-on-rails/3.2/cookies.html#cookies_permanent
All rights reserved