Try using it in your preferred language.

English

  • English
  • 汉语
  • Español
  • Bahasa Indonesia
  • Português
  • Русский
  • 日本語
  • 한국어
  • Deutsch
  • Français
  • Italiano
  • Türkçe
  • Tiếng Việt
  • ไทย
  • Polski
  • Nederlands
  • हिन्दी
  • Magyar
translation

Dit is een door AI vertaalde post.

제이온

[Spring] Wat zijn Filter, Interceptor en Argument Resolver?

Selecteer taal

  • Nederlands
  • English
  • 汉语
  • Español
  • Bahasa Indonesia
  • Português
  • Русский
  • 日本語
  • 한국어
  • Deutsch
  • Français
  • Italiano
  • Türkçe
  • Tiếng Việt
  • ไทย
  • Polski
  • हिन्दी
  • Magyar

Samengevat door durumis AI

  • Filters bieden een J2EE-standaardspecificatiefunctie waarmee extra taken kunnen worden uitgevoerd voor alle verzoeken die voldoen aan een URL-patroon, zowel voor als na het doorgeven van het verzoek aan de dispatcher-servlet. Filters werken in de webcontainer, terwijl interceptors een technologie zijn die door Spring wordt geleverd. Interceptors bieden een functie waarmee verzoeken en antwoorden kunnen worden geraadpleegd of bewerkt voor en na het aanroepen van de controller door de dispatcher-servlet. Interceptors werken in de Spring-context.
  • Argument resolvers kunnen indirect een object maken met behulp van de waarden die binnenkomen bij een verzoek wanneer een verzoek een controller bereikt.
  • Filters en interceptors verschillen in hun werking: filters werken in de webcontainer terwijl interceptors in de Spring- container werken. Filters verwerken verzoeken op basis van de dispatcher-servlet, terwijl interceptors verzoeken op basis van de controller verwerken. Argument resolvers werken na interceptors en retourneren een specifiek object.

Wat is een filter (Filter)?

Een filter is een J2EE-standaardspecificatiefunctie die extra werk kan verwerken voor elke aanvraag die overeenkomt met een URL-patroon, voordat of nadat de aanvraag naar de DispatcherServlet wordt doorgegeven. Met andere woorden, het wordt beheerd door de webcontainer, zoals Tomcat, in plaats van de Spring-container, dus het verwerkt de aanvraag voordat deze naar de DispatcherServlet gaat.



Filter (Filter) implementatie

Om een filter toe te voegen, moet je de Filter-interface van javax.servlet implementeren. Deze heeft de volgende drie methoden:


  • init-methode
    • Dit is de methode om het filterobject te initialiseren en aan de service toe te voegen. De webcontainer roept de init-methode één keer aan om het filterobject te initialiseren, waarna alle volgende verzoeken worden verwerkt via de doFilter()-methode.
  • doFilter-methode
    • Deze methode wordt uitgevoerd door de webcontainer voordat elk HTTP-verzoek dat overeenkomt met het URL-patroon naar de DispatcherServlet wordt doorgegeven, en voordat de DispatcherServlet een HTTP-antwoord naar de client stuurt.
      De doFilter()-methode heeft een FilterChain als parameter. De doFilter()-methode van FilterChain geeft de aanvraag door naar de volgende doel. Door de nodige bewerkingen toe te voegen voor en na chain.doFilter(), kun je de gewenste bewerkingen uitvoeren.
  • destory-methode
    • Deze methode wordt gebruikt om het filterobject uit de service te verwijderen en de gebruikte resources terug te geven. Deze wordt één keer aangeroepen door de webcontainer en wordt daarna niet meer door doFilter() verwerkt.


Voorbeeldcode - Servlet-specificatie

@WebFilter("/*")
public class dolphagoFilter implements Filter {

    @Override
      public void init(FilterConfig filterConfig) throws ServletException {}

    @Override
      public void doFilter(ServletRequest request, ServletResponse response, 
FilterChain filterChain) throws IOException, ServletException {
        //Voorverwerking hier
        request.setCharacterEncoding("UTF-8");
        System.out.println("doFilter() vóór....");

        filterChain.doFilter(request, response);

        //Nabewerking hier
        System.out.println("doFilter() na....");
      }

    @Override
      public void destroy() {    }


Voorbeeldcode - @Component

@Order(1)
@Component
public class CustomFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException { }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
        throws IOException, ServletException {
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() { }


  • @Component: Een filter kan als een Spring-bean worden geregistreerd.
  • @Order: Als er meerdere filters zijn, kan de volgorde worden ingesteld.
  • Als een filter dat overeenkomt met de servlet-specificatie als een Spring-bean wordt geregistreerd, kunnen andere beans die overeenkomen met de Spring-specificatie worden gebruikt.


Voorbeeldcode - @Configuration

@Configuration
public class CustomRegistrationBean {

    @Bean
    public FilterRegistrationBean customFilterBean() {
        FilterRegistrationBean registration = new FilterRegistrationBean<>();
        registration.setFilter(new CustomFilter());
        registration.setOrder(1);
        registration.addUrlPatterns("/api/*");
        return registration;
    }

Als je wilt dat een filter alleen voor een bepaalde URI werkt, kun je het filter registreren als een Spring-bean met behulp van FilterRegistrationBean.


Filter (Filter) doeleinden

Filters zijn voornamelijk verantwoordelijk voor het valideren en verwerken van aanvraagparameters zelf.


  • Algemene taken met betrekking tot beveiliging
    • Omdat filters in de webcontainer werken, kunnen ze beveiligingscontroles uitvoeren (zoals XSS en CSRF-bescherming) en onjuiste aanvragen blokkeren. De aanvraag wordt dan niet naar de Spring-container doorgestuurd en geblokkeerd, waardoor de stabiliteit wordt verbeterd.
  • Logboekregistratie voor alle verzoeken
  • Afbeeldingen/gegevens comprimeren en tekenreekscodering
    • Filters implementeren functies die algemeen worden gebruikt in webapplicaties, zoals het comprimeren van afbeeldingen of gegevens, of het coderen van tekenreeksen.
  • ServletRequest aanpassen
    • HttpServletRequest kan de inhoud van de Body slechts één keer lezen. Daarom kunnen filters of interceptors de Body niet lezen. Om de Body te loggen, kun je een aangepaste ServletRequest maken.


Interceptor

Wat is een Interceptor?

In tegenstelling tot filters (Filters), die een J2EE-standaardspecificatie zijn, is een interceptor (Interceptor) een technologie die wordt aangeboden door Spring. Interceptors kunnen aanvragen en antwoorden bekijken of verwerken vóór en nadat de DispatcherServlet een controller aanroept. Met andere woorden, in tegenstelling tot filters die in de webcontainer werken, werken interceptors in de Spring-context.


De DispatcherServlet vraagt de handler-mapping om de juiste controller te vinden. Als resultaat wordt een uitvoeringsketen (HandlerExecutionChain) teruggegeven. Deze uitvoeringsketen heeft één of meer geregistreerde interceptors. Als er interceptors zijn geregistreerd, worden deze opeenvolgend aangeroepen voordat de controller wordt uitgevoerd. Als er geen interceptors zijn, wordt de controller direct uitgevoerd.


Interceptor-implementatie

Om een interceptor toe te voegen, moet je de org.springframework.web.servlet.HandlerInterceptor-interface implementeren. Deze heeft de volgende drie methoden:


  • preHandle-methode
    • De preHandle-methode wordt uitgevoerd voordat de controller wordt aangeroepen. Daarom kan deze worden gebruikt voor voorverwerkingsstappen voor de controller, zoals het verwerken of toevoegen van aanvraaggegevens.
    • De handler-parameter, de derde parameter van de preHandle-methode, is een abstract object dat de informatie over de methode met de @RequestMapping-annotatie representeert.
    • De preHandle-methode retourneert een boolean. Als de retourwaarde true is, gaat de uitvoering door naar de volgende stap. Als de retourwaarde false is, wordt de uitvoering gestopt en worden de volgende stappen (de volgende interceptor of de controller) niet uitgevoerd.
  • postHandle-methode
    • De postHandle-methode wordt uitgevoerd nadat de controller is aangeroepen. Daarom kan deze worden gebruikt voor naverwerkingsstappen na de controller.
  • afterCompletion-methode
    • De afterCompletion-methode wordt, zoals de naam al doet vermoeden, uitgevoerd nadat alle taken zijn voltooid, inclusief het genereren van het uiteindelijke resultaat in alle views.


Voorbeeldcode

@Component
public class CustomInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
        throws Exception {
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
        ModelAndView modelAndView) throws Exception {
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
        throws Exception {
    }
}

@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new CustomInterceptor());
        registry.addInterceptor(new LoggingInterceptor());
    }


  • De gemaakte interceptor wordt geregistreerd als een bean.
  • De gemaakte interceptor wordt geregistreerd in de addInterceptors()-methode van de WebMvcConfigurer-interface.
  • Interceptors worden in de volgorde uitgevoerd waarin ze in InterceptorRegistry zijn geregistreerd.


Interceptor-doeleinden

Interceptors zijn voornamelijk verantwoordelijk voor het verwerken van de consistentie van aanvraaggegevens met behulp van service-logica.


  • Algemene taken zoals authenticatie/autorisatie
    • Typische voorbeelden zijn authenticatie en autorisatie. Met interceptors kunnen taken die verband houden met client-aanvragen worden gecontroleerd voordat deze naar de controller worden doorgestuurd.
  • Logboekregistratie voor API-aanroepen
    • Via de doorgegeven HttpServletRequest en HttpServletResponse-objecten kan informatie over de client worden vastgelegd.
  • Gegevens verwerken die naar de Controller worden doorgestuurd
    • De doorgegeven HttpServletRequest en HttpServletResponse-objecten kunnen worden verwerkt en doorgestuurd naar de controller.
  • AOP nabootsen
    • Met de handlerMethod-parameter, de derde parameter van de preHandle()-methode, kan extra informatie over de te executeren methode worden achterhaald, zoals de methodesignatuur, om te bepalen of de logica moet worden uitgevoerd.


Filter (Filter) vs Interceptor

  • Filters worden uitgevoerd in de webcontext, terwijl interceptors worden uitgevoerd in de Spring-context. Ze hebben dus een andere uitvoeringstijd.
  • Filters kunnen worden gebruikt voor en na de DispatcherServlet, terwijl interceptors kunnen worden gebruikt voor en na de controller.
  • Filters zijn een goed idee om taken te verwerken die onafhankelijk van Spring globaal moeten worden verwerkt, of om de ingekomen parameters zelf te valideren, of als je ServletRequest in plaats van HttpServletRequest moet gebruiken.
  • Interceptors zijn een goed idee om taken te verwerken die globaal moeten worden verwerkt op het niveau van Spring, of als je service-logica moet combineren.
  • Interceptors kunnen @ControllerAdvice en @ExceptionHandler gebruiken om uitzonderingen af te handelen, maar filters kunnen dat niet.
    • Filters gebruiken meestal try~catch-blokken rond de doFilter()-methode om uitzonderingen die op dat moment voorkomen direct af te handelen.


Argumentresolver

Wat is een Argumentresolver?

Een Argumentresolver kan indirect helpen bij het maken van het gewenste object uit de waarden die in een aanvraag zijn meegestuurd, wanneer een aanvraag een controller bereikt.


Argumentresolver-doeleinden

Stel dat een aanvraag met een JWT-token wordt verzonden. We moeten controleren of het token geldig is en vervolgens de ID uit het token halen om een inlog-gebruikersobject te maken.

Zonder een Argumentresolver zouden we deze verificatie en omzetting van het token naar een inlog-gebruikersobject in elke controller moeten implementeren. Dit zou leiden tot dubbele code in controllers die gebruikersverificatie vereisen en de verantwoordelijkheid van de controllers zou toenemen. Argumentresolvers kunnen dit probleem oplossen.


Argumentresolver-implementatie

Argumentresolvers kunnen worden gebruikt door de HandlerMethodArgumentResolver te implementeren. Deze interface vereist de implementatie van de volgende twee methoden:


boolean supportsParameter(MethodParameter parameter);

@Nullable


  • supportsParameter-methode
    • Er wordt een specifieke annotatie aan de parameter toegevoegd waarvoor je wilt dat de Argumentresolver wordt uitgevoerd. De supportsParameter()-methode controleert of de opgevraagde methode een parameter met de gewenste annotatie heeft. Als die aanwezig is, wordt true geretourneerd.
  • resolveArgument-methode
    • Als supportsParameter true retourneert, d.w.z. als er een methode is met de specifieke annotatie, dan is dit de methode die de informatie uit de parameter bindt en retourneert in de gewenste vorm.


De implementatie van de controller met behulp van Argumentresolver is als volgt:


@GetMapping("/me")
public ResponseEntity findMemberOfMine(@AuthenticationPrincipal LoginMember loginMember) {
    MemberResponse memberResponse = memberService.findMember(loginMember.getId());
    return ResponseEntity.ok().body(memberResponse);


Verschil tussen Argumentresolver en Interceptor

  • Argumentresolvers worden uitgevoerd na interceptors en geven het gewenste object terug op basis van de waarden die zijn meegestuurd in een aanvraag wanneer een aanvraag een controller bereikt.
  • Interceptors daarentegen onderscheppen de aanvraag voordat de controller daadwerkelijk wordt uitgevoerd en kunnen geen specifiek object retourneren. Alleen boolean- of void-retourtypen zijn mogelijk.


Bron


Verwachte interviewvragen en -antwoorden

Wat is een filter?

Een filter is een functie die extra werk kan verwerken voor elk verzoek dat overeenkomt met een URL-patroon, voordat of nadat het verzoek naar de DispatcherServlet wordt doorgestuurd. Het werkt op het niveau van de servlet-container.


Wanneer moet je een filter gebruiken?

Filters kunnen worden gebruikt om taken te verwerken die onafhankelijk van Spring globaal moeten worden verwerkt. Ze kunnen ook worden gebruikt om de ingekomen parameters zelf te valideren.

Typische voorbeelden zijn algemene taken met betrekking tot beveiliging, logboekregistratie voor alle verzoeken, het comprimeren van afbeeldingen/gegevens en tekenreekscodering, en het aanpassen van ServletRequest.


Wat is een interceptor?

Een interceptor is een technologie die wordt aangeboden door Spring. Interceptors kunnen aanvragen en antwoorden bekijken of verwerken vóór en nadat de DispatcherServlet een controller aanroept. Met andere woorden, in tegenstelling tot filters die in de webcontainer werken, werken interceptors in de Spring-context.


Wanneer moet je een interceptor gebruiken?

Interceptors kunnen worden gebruikt om taken te verwerken die globaal moeten worden verwerkt met betrekking tot clientverzoeken, of wanneer verificatie met behulp van service-logica nodig is.

Typische voorbeelden zijn algemene taken zoals authenticatie/autorisatie, logboekregistratie voor API-aanroepen, en het verwerken van gegevens die naar de Controller worden doorgestuurd.


Wat is het verschil tussen een filter en een interceptor?

Filters worden uitgevoerd op het niveau van de servlet-container, terwijl interceptors worden uitgevoerd op het niveau van de Spring-container.

Filters kunnen worden gebruikt voor en na de DispatcherServlet, terwijl interceptors kunnen worden gebruikt voor en na de controller.

Dus, filters zijn een goed idee om taken te verwerken die onafhankelijk van Spring globaal moeten worden verwerkt, terwijl interceptors een goed idee zijn om taken te verwerken die globaal moeten worden verwerkt met betrekking tot clientverzoeken.


Wat is een Argumentresolver?

Een Argumentresolver kan indirect helpen bij het maken van het gewenste object uit de waarden die in een aanvraag zijn meegestuurd, wanneer een aanvraag een controller bereikt.


Wanneer moet je een Argumentresolver gebruiken?

Je kunt Argumentresolvers gebruiken wanneer een aanvraag met een JWT-token wordt verzonden. Dan kun je controleren of het token geldig is en vervolgens de ID uit het token halen om een LoginMember-object te maken.


Wat is het verschil tussen een interceptor en een Argumentresolver?

Argumentresolvers geven het gewenste object terug op basis van de waarden die zijn meegestuurd in een aanvraag wanneer een aanvraag een controller bereikt. Interceptors kunnen daarentegen geen specifiek object retourneren en worden uitgevoerd vóór Argumentresolvers.

제이온
제이온
제이온
제이온
[Spring] @Async gebruiken Ontdek hoe je Java-asynchrone verwerking gemakkelijk kunt implementeren met behulp van Spring @Async. Met de @Async-annotatie kun je synchrone methoden naar asynchroon converteren en de efficiëntie verhogen door thread-poolinstellingen. We behandelen ook

25 april 2024

[Java] Reflectie concept en gebruik Reflectie is een API die ondersteuning biedt om toegang te krijgen tot klasse-informatie tijdens de uitvoering van een Java-programma, zodat klassen kunnen worden gemanipuleerd. Tijdens runtime kunnen klassen worden gemaakt en toegang tot velden en method

25 april 2024

[Effectieve Java] Item 6. Vermijd onnodige objectcreatie Een gids over het verminderen van onnodige objectcreatie in Java. Voor onveranderlijke objecten zoals String en Boolean is het beter om literals te gebruiken, en voor reguliere expressies is het beter om Pattern-instanties te cachen. Autoboxing kan ook le

28 april 2024

[Niet-major, overleven als ontwikkelaar] 14. Samenvatting van veelgestelde technische interviewvragen voor beginnende ontwikkelaars Deze gids is bedoeld om beginnende ontwikkelaars te helpen met de voorbereiding op technische interviews. Het behandelt concepten die vaak ter sprake komen tijdens interviews, zoals het hoofdgeheugengebied, gegevensstructuren, RDBMS en NoSQL, procedurele
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자

3 april 2024

[Niet-technische, ontwikkelen voor een levensonderhoud] 16. Tips voor het maken van een portfolio voor beginnende ontwikkelaars Beginnende ontwikkelaars (met name niet-technische) moeten bij het maken van een portfolio niet alleen hun vaardigheden, maar ook de ontwikkelde diensten of functies duidelijk beschrijven. Bijvoorbeeld, voor een "baanzoekersgemeenschap" project, moet je c
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자

3 april 2024

Wat is een regelgebaseerde chatbot? Een regelgebaseerde chatbot is een chatbot die reageert op gebruikersinvoer volgens vooraf gedefinieerde regels. Dit type chatbot is geschikt voor eenvoudige vragen of het verstrekken van gestructureerde informatie. Het is ideaal voor FAQ-chatbots of klan
꿈많은청년들
꿈많은청년들
Afbeelding met de tekst 'Regelgebaseerd'
꿈많은청년들
꿈많은청년들

16 mei 2024

Conceptueel gegevensmodellering Conceptueel gegevensmodellering is het proces van het scheiden van entiteiten en het uitdrukken van relaties tussen entiteiten in een ERD. Entiteiten zijn onafhankelijke informatie-eenheden, en attributen zijn de gegevens die een entiteit bezit. Identific
제이의 블로그
제이의 블로그
제이의 블로그
제이의 블로그

8 april 2024

[SI-ontwikkelaarverhaal] 12. Technologieën die vaak worden gebruikt in SI-projecten De technologieën die vaak worden gebruikt in SI-ontwikkeling bij Zuid-Koreaanse MKB's zijn Java-gebaseerde Spring, Oracle DB, Mybatis, JSP, JavaScript, HTML, CSS, met Eclipse als IDE.
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자

19 april 2024

[React Hook] useState Deze blogpost beschrijft in detail waarom de useState-hook in React de volledige component opnieuw rendert bij het opnieuw renderen, hoe waarden worden behouden en hoe de interne implementatiestructuur werkt. Door de analyse van de ReactFiberHooks.js-code
Sunrabbit
Sunrabbit
Sunrabbit
Sunrabbit

14 maart 2024