Cześć!
Chciałbym się dowiedzieć czy jest możliwość utworzenia blokady optymistycznej w aplikacji bezstanowej. Tworzę aplikację opartą o Spring-boot oraz AngularJS, łącząc całość za pomocą RESTa, a jako mechanizm uwierzytelniania wykorzystuję Json Web Token.
Przechodząc do sedna problemu: chciałbym wczytać jakiś obiekt z bazy danych, udostępnić go do edycji na froncie, a następnie zapisać. Próbowałem to zrobić tak, aby przesyłać pole wersji (oznaczone w encji jako @Version) na front, razem z innymi danymi.Jest to jednak słabe rozwiązanie, gdyż wersja jest wtedy podatna na zmianę przez użytkownika.
Czy istnieje zatem jakaś możliwość, bez wykorzystywania komponentów stanowych, aby dokonać blokady optymistycznej?
Blokada optymistyczna w aplikacji bezstanowej
- Rejestracja: dni
- Ostatnio: dni
- Postów: 6
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: XML Hills
Nie znam się na Angularze ale odpowiem: wyłącz edycję dla pola z wersją ;]
- Rejestracja: dni
- Ostatnio: dni
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: XML Hills
No dobra. Jeżeli ten obiekt jest taki ważny to przyszło mi do głowy pewne rozwiązanie: dodaj podpis numeru wersji. A więc do przesyłanej encji dojdą dwa pola: sól oraz hasz(wersja + publiczna sól z pola + prywatna sól z serwera).
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Warszawa
- Postów: 293
No to może po prostu zamiast wysyłać wersji w czystej postaci, wysyłaj jej hasha, np. SHA256? I gdy wraca, sprawdź czy
hash(entity.version) equals requestObject.hashedVersion
(w odniesieniu do filmu powyżej)
- Rejestracja: dni
- Ostatnio: dni
- Postów: 6
Próbowałem zrobić to sposobem zaproponowanym przez @vpiotr, jednak nie udało mi się. Co prawda ETag był generowany przy zapytaniu GET, jednak nie potrafiłem obsłużyć tego przy próbie zapisu - nie mam pojęcia z czego był generowany ten hash.
Rozwiązałem to, tworząc hash MD5 pola wersji, który przesyłam jako ETag. Mam nadzieję, że to będzie wystarczającym rozwiązaniem.
Dzięki wszystkim za pomoc :)