Cześć.
Używam Spring Boota. Mam zwykłe bezstanowe beany singletony (oznaczane w Spring Boot jako @Component
- domyślnie są singletonem).
Jeden z takich beanów o których będę tutaj mówić nazywa się CustomerAuthService
a drugi CustomerAuthController
, który to jest springowym REST controllerem.
Wstrzykuję sobie przez konstruktor za pomocą adnotacji @Autowired
(bo tak powinniście wstrzykiwać swoje zależności, aby komponenty były łatwo testowalne) pole
private final HttpServletRequest request;
do CustomerAuthService
.
W tym momencie jeżeli wykonam request do CustomerAuthController i on wywola metodę na CustomerAuthService to w
pole private final HttpServletRequest request;
w CustomerAuthService jest wsktrzykiwany ten właśnie request, który poszedł do CustomerAuthController.
-
Czy dobrze myślę, że w tym momencie
CustomerAuthService
przestaje być bezstanowym, bo mimo złudnego final przy polu HttpServletRequest request będzie przechowywać requesta w scopie request? -
Co w przypadku jeżeli dwa requesty wejdą jednocześnie - request A i request B? Powstaną dwa osobne wątki
http-nio-8080-exec-5
aby obsłużyć request A ihttp-nio-8080-exec-6
aby obsłużyć request B. Dla wątkuhttp-nio-8080-exec-5
pole request w serwisie CustomerAuthService będzie równe requestowi A a dla wątkuhttp-nio-8080-exec-6
pole request w serwisie CustomerAuthService równe requestowi B? Czy sądzicie, że wstrzyknięcie pola HttpServletRequest jest bezpieczne i czy jest dobrym podejściem oraz jak rozwiązuje to Spring Framework (tak naprawdę wygląda na to, że pole HttpServletRequest request będzie się co chwila zmieniać - jest gdzieś dokumentacja opisująca takie zachowanie? -
Co jeżeli macie złożoną aplikacje i potrzebujecie przechowywać dane z requesta, dane kontekstu wywołania danego endpointu pomiędzy wieloma serwisami?
Chodzi mi o rozwiązanie podobne doSecurityContextHolder.getContext().getAuthentication().getPrincipal()
z Spring Security.
Zamiast przekazywać 15 razy przez wszystkie metody username itd... łamie się takie bezsensowne przekazywania wywołań na rzecz jednego współdzielonego obiektu przechowującego stan na scope sesji.
Ja zamiast przekazywać 15 parametrów między metodami myślałam, żeby zrobić sobie własnie coś na zasadzie takiego RequestContextHolder - na scope requestu, być może tylko z wyciągniętymi danymi których potrzebuje i tylko readonly.
Co myślicie o takim podejściu i czy robicie tak w swoich aplikacjach?
Pozdrawiam