[Spring Boot] Escludere alcuni endpoints dai filtri

di il
3 risposte

[Spring Boot] Escludere alcuni endpoints dai filtri

Ciao!

avrei la necessità di escludere alcuni endpoints da un filtri in spring boot.

per adesso, vista l'urgenza, ho fatto cosi:

import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.GenericFilterBean;

import java.io.IOException;
import java.util.Arrays;

@Component
@Order(1)
public class AuthFilter extends GenericFilterBean {
  @Override
  public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    HttpServletRequest header = (HttpServletRequest) servletRequest;
    String uri = header.getRequestURI();
    String[] rotteEscluse = new String[]{"/utenti/login"};
    boolean contains = Arrays.asList(rotteEscluse).contains(uri);

    if (!contains) {
      // DI STUFF
    }

    filterChain.doFilter(servletRequest, servletResponse);
  }
}

ma non mi piace come soluzione.

qualche suggerimento?

3 Risposte

  • Re: [Spring Boot] Escludere alcuni endpoints dai filtri

    Invece di estendere GenericFilterBean potresti estendere una sua sottoclasse: OncePerRequestFilter
    https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/filter/OncePerRequestFilter.html

    Questa classe è pensata per garantire che il filtro venga applicato una sola volta per ogni richiesta e mette a disposizione i seguenti metodi:

    - doFilterInternal: che ha lo stesso contratto della doFilter e gli stessi parametri

    - shouldNotFilter(HttpServletRequest request): che ritorna true se la URL richiesta NON deve essere filtrata

    Cambia "poco" rispetto alla tua versione, ma ti permette di avere un maggior controllo sulle URL da non filtrare e ridurre eventuali errori (poichè il codice di controllo delle URL è separato dal codice di filtro vero e proprio).

  • Re: [Spring Boot] Escludere alcuni endpoints dai filtri

    Ciao!

    grazie per la risposta.

    ho provato così:

    @Component
    @Order(1)
    public class AuthFilter extends OncePerRequestFilter {
    
      private Set<String> rotteEscluse = new HashSet<>(List.of("/utenti/login"));
      private AntPathMatcher pathMatcher = new AntPathMatcher();
    
      @Override
      protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        System.out.println("FILTER");
    
        filterChain.doFilter(request, response);
      }
    
      @Override
      protected boolean shouldNotFilter(HttpServletRequest request) {
        System.out.println("NO FILTER");
        return rotteEscluse.stream().anyMatch(p -> pathMatcher.match(p, request.getRequestURI()));
      }
    
    }

    solo che il comportamento che ha è strano.

    se interrogo un qualsiasi endpoint mi escono sia FILTER che NO FILTER.

    se interrogo "utenti/login" mi esce solo NO FILTER (quindi corretto).

    in sostanza mi fa l'esclusione, ma non funziona per tutti quelli non da escludere.

  • Re: [Spring Boot] Escludere alcuni endpoints dai filtri

    No scusate, funziona tutto alla perfezione.

    il problema era da un'altra parte!

    grazie!!

Devi accedere o registrarti per scrivere nel forum
3 risposte