任何用户都可以“喜欢”我网站上的照片。但如果他多次按下按钮(例如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/