Cookies with Rails
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 ...
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.
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
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