ruby-on-rails - 如何保护我的网站免受多个帖子请求的影响?

标签 ruby-on-rails ruby

任何用户都可以“喜欢”我网站上的照片。但如果他多次按下按钮(例如10次),则这10个post请求将被发送到服务器。 我尝试在 session 的帮助下解决。 我以为这段代码每 5 秒就需要点赞。但事实并非如此!有我的操作和 before_filter:

def like
   photo.create_like if session[:voted].nil?
   session[:voted] = Time.now.to_a.first(3).reverse.join
   redirect_to root_path
end


def check_session
  a = Time.now.to_a.first(3).reverse.join
  b = a.to_i - session[:voted].to_i  
   session[:voted] = nil if b >= 5

end

最佳答案

您不能使用 session 执行此操作(至少不能使用默认 session 存储):默认情况下,rails 将 session 存储在 cookie 中。

Cookie 由浏览器作为请求的一部分发送,并且服务器的响应可以选择更新它们。如果您快速连续多次单击“赞”按钮,那么您将发出多个请求,每个请求都包含代表 session 当前状态的 cookie 数据。您的响应会更新 session ,但对于已发送的请求来说为时已晚 - 它们的 session 数据已发送到服务器,并且不会包含响应所做的任何更改。

正如其他人所说,创可贴是使用 Javascript 来限制多次提交,但处理此问题的唯一可靠方法是在数据库级别(在喜欢表上使用唯一索引)。

关于ruby-on-rails - 如何保护我的网站免受多个帖子请求的影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30276376/

相关文章:

ruby-on-rails - 如何强制 Rails 加载所有模型?

ruby - 从 S3 逐行流式传输大文件

ruby - 使用 Thin 和 EventMachine 运行模块化 Sinatra 应用程序。启动两次?

ruby-on-rails - 在 Rails 中清理输出

ruby - 检测类方法中的新方法可见性

css - Bootstrap for Rails 的替代品

ruby-on-rails - 通过包含 has_many 的列

ruby - 在 ruby​​ 中杀死一个名为 using open3 的进程

ruby-on-rails - 使用 current_page 在 HAML 中激活链接?

html - 使用 Rails 创建嵌套记录