Spring Bootissa (Spring MVC) pyyntö kulkee servlet-containerin, Filter-ketjun, keskeisen **DispatcherServlet**in, sitten interceptorien ja sinun **@Controller**isi läpi, ja paluuarvo muunnetaan HTTP-responseksi.
Spring Bootissa (Spring MVC) pyyntö kulkee servlet-containerin, Filter-ketjun, keskeisen **DispatcherServlet**in, sitten interceptorien ja sinun **@Controller**isi läpi, ja paluuarvo muunnetaan HTTP-responseksi.
Servlet-container (Tomcat)
▼
Filter-ketju ── (CharacterEncoding, Security, CORS, ...)
▼
DispatcherServlet ── front controller
▼
HandlerMapping ── etsi @Controller-metodi
▼
HandlerInterceptor.preHandle
▼
Argument resolverit ── bindaa @RequestBody / @PathVariable / @RequestParam
▼
Controller-metodi ── logiikkasi → palauttaa objektin tai ResponseEntityn
▼
HandlerInterceptor.postHandle
▼
HttpMessageConverter / ViewResolver ── serialisoi JSONiksi tai renderöi view
▼
HandlerInterceptor.afterCompletion → Response ──▶ client
Filter-ketjulle. Filterit (mukaan lukien Spring Security) ovat uloin kerros ja voivat blokata tai kietoa pyynnön ennen kuin MVC näkee sen.preHandle — HandlerInterceptorit ajetaan ennen controlleria (auth-tarkistukset, logging, ajanotto); falsen palauttaminen pysäyttää pyynnön.@PathVariable, @RequestParam ja @RequestBody (HttpMessageConverterin kautta) bindataan ja validoidaan.@RestController-metodisi ajaa liiketoimintalogiikan ja palauttaa objektin tai ResponseEntityn.postHandle, sitten paluuarvo serialisoidaan HttpMessageConverterilla (JSON Jacksonin kautta) tai view renderöidään ViewResolverilla.afterCompletion ajetaan sen jälkeen kun response on commitattu; @ExceptionHandler/@ControllerAdvice käsittelevät poikkeukset matkan varrella.// 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 = oikaisu
}
}
// 6. controller
@RestController
class ItemController {
@GetMapping("/items/{id}") // 3. mapping
ResponseEntity<Item> show(@PathVariable Long id) { // 5. argument-resolvointi
return ResponseEntity.ok(service.find(id)); // 7. serialisoitu JSONiksi
}
}
Springin elinkaaressa on kaksi erillistä laajennuskerrosta, joita haastattelijat rakastavat tutkia: Filterit (servlet-tasolla, uloimpana — missä Spring Security elää) ja Interceptorit (Spring MVC -tasolla, controllerin ympärillä). Järjestyksen tunteminen — filterit, DispatcherServlet, mapping, interceptorin preHandle, argumenttien bindaus, controller, message-konversio, afterCompletion — kertoo sinulle minne autentikointi vs. logging kuuluu, miksi Security-filter hylkää pyynnön ennen kuin yksikään interceptor tai controller ajetaan, ja miten @ControllerAdvice keskittää poikkeusten käsittelyn koko flow'n yli.
Kirjasto IT-haastattelukysymyksiä yksityiskohtaisine vastauksineen — Juniorista Senioriin.
Lahjoita