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?
Nie znam się na Angularze ale odpowiem: wyłącz edycję dla pola z wersją ;]
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).
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)
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 :)
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.