Chcę zapobiec zbyt szybkiemu wysyłaniu żądań z ajax przez użytkowników. Napisałem walidację w kontrolerze jak poniżej.
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
Sen 2 sekundy oznacza czas wykonania mojego programu. Jeśli usunę sen 2 sekundy, wszystko działa dobrze. Wynik byłby jak poniżej, gdy wysyłam żądania naprawdę szybko.
-----------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 ----------------------------
Ale jeśli drugie lub więcej wniosków zostało wysłanych przed zakończeniem pierwszego. Wynik byłby nieoczekiwany. Jeśli dodam sen 2 w kodzie weryfikacyjnym.
-----------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 ----------------------------
Jestem całkowicie zdezorientowany tą sytuacją. Czy wartość sesji nie zostanie zapisana przed zakończeniem żądania? Jak mam naprawić ten problem?
1 odpowiedź
Wygląda na to, że zmienne sesji będą przechowywane później podczas przetwarzania cyklu życia kontrolera? obejściem może być użycie redis w tym przypadku?
Powinieneś znaleźć sposób, aby upewnić się, że zmienna, której używasz, jest trwała dla większej liczby równoległych żądań.
Podobne pytania
Nowe pytania
ruby-on-rails
Ruby on Rails to framework aplikacji internetowych typu open source z pełnym stosem, napisany w języku Ruby. Opiera się na popularnym modelu frameworkowym MVC i jest znany ze swojego podejścia do tworzenia aplikacji „konwencja zamiast konfiguracji”.