W Spring Boot (Spring MVC) żądanie przechodzi przez kontener serwletów (servlet container), łańcuch Filtrów, centralny DispatcherServlet, następnie interceptory i Twój @Controller, a wartość zwracana jest konwertowana na odpowiedź HTTP.
W Spring Boot (Spring MVC) żądanie przechodzi przez kontener serwletów (servlet container), łańcuch Filtrów, centralny DispatcherServlet, następnie interceptory i Twój @Controller, a wartość zwracana jest konwertowana na odpowiedź HTTP.
Servlet container (Tomcat)
▼
Filter chain ── (CharacterEncoding, Security, CORS, ...)
▼
DispatcherServlet ── front controller
▼
HandlerMapping ── znajdź metodę @Controller
▼
HandlerInterceptor.preHandle
▼
Argument resolvers ── bind @RequestBody / @PathVariable / @RequestParam
▼
Controller method ── Twoja logika → zwraca obiekt lub ResponseEntity
▼
HandlerInterceptor.postHandle
▼
HttpMessageConverter / ViewResolver ── serializuj do JSON lub renderuj widok
▼
HandlerInterceptor.afterCompletion → Response ──▶ client
Filter. Filtry (w tym Spring Security) są najbardziej zewnętrzną warstwą i mogą zablokować lub opakować żądanie, zanim zobaczy je MVC.preHandle — HandlerInterceptory uruchamiają się przed kontrolerem (sprawdzanie auth, logowanie, mierzenie czasu); zwrócenie false zatrzymuje żądanie.@PathVariable, @RequestParam i @RequestBody (przez HttpMessageConverter) są bindowane i walidowane.@RestController wykonuje logikę biznesową i zwraca obiekt lub ResponseEntity.postHandle, a następnie wartość zwracana jest serializowana przez HttpMessageConverter (JSON przez Jackson) lub widok jest renderowany przez ViewResolver.afterCompletion uruchamia się po zatwierdzeniu (commit) odpowiedzi; @ExceptionHandler/@ControllerAdvice obsługują wyjątki po drodze.// 4/7/8. interceptor
public class TimingInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object h) {
req.setAttribute("started", System.nanoTime());
return true; // false = przerwij łańcuch
}
}
// 6. controller
@RestController
class ItemController {
@GetMapping("/items/{id}") // 3. mapping
ResponseEntity<Item> show(@PathVariable Long id) { // 5. argument resolution
return ResponseEntity.ok(service.find(id)); // 7. serializacja do JSON
}
}
Cykl życia Springa ma dwie odrębne warstwy rozszerzeń, które ankieterzy uwielbiają zgłębiać: Filtry (na poziomie serwletu, najbardziej zewnętrzne — gdzie działa Spring Security) i Interceptory (na poziomie Spring MVC, wokół kontrolera). Znajomość kolejności — filtry, DispatcherServlet, mapping, preHandle interceptora, bindowanie argumentów, controller, konwersja wiadomości, afterCompletion — mówi Ci, gdzie umieścić uwierzytelnianie, a gdzie logowanie, dlaczego filtr Security odrzuca żądanie, zanim uruchomi się jakikolwiek interceptor lub controller, i jak @ControllerAdvice centralizuje obsługę wyjątków w całym przepływie.
Biblioteka pytań rekrutacyjnych IT ze szczegółowymi odpowiedziami — od Juniora do Seniora.
Wesprzyj