我想防止用户从ajax发送请求的速度过快。我在控制器中写了下面的验证。
def before_action
if session[:expires_at].nil?
logger.info "Operation is legal"
session[:expires_at] = Time.current + 3.seconds
elsif Time.current > session[:expires_at].to_time
logger.info "Operation is legal"
session[:expires_at] = Time.current + 3.seconds
else
logger.info "Error: Operation too fast"
render json: { msg: "Operation too fast",res: "Err"}
return
end
sleep 2 <-- The issue happends here
end
睡眠2秒表示我的程序执行时间。如果我取消睡眠2秒钟,一切都会正常。当我真正快速发送请求时,结果如下所示。
-----------Logs------------- Operation is legal Error: Operation too fast Error: Operation too fast Error: Operation too fast Error: Operation too fast Error: Operation too fast Operation is legal Error: Operation too fast Error: Operation too fast Error: Operation too fast ----------------------------
但是,如果在第一个请求执行之前发送了第二个或更多请求。结果将是意外的。如果我在验证代码中添加sleep 2。
-----------Logs------------- Operation is legal Operation is legal Operation is legal Error: Operation too fast Error: Operation too fast Error: Operation too fast Error: Operation too fast Operation is legal Operation is legal Error: Operation too fast Error: Operation too fast ----------------------------
我对这种情况完全感到困惑。在请求完成之前会不会保存会话值?我应该如何解决这个问题?
答案 0 :(得分:1)
看起来会话变量将在以后处理控制器生命周期时存储?解决方法是在这种情况下使用redis?
您应该找到一种方法来确保所使用的变量在更多并行请求中具有持久性。