2014-05-13 9 views
7

Utilizzando un filtro personalizzato Spring Security, desidero restituire un codice di errore HTTP 401 se l'intestazione HTTP non contiene una particolare coppia chiave-valore.Return HTTP Error 401 Code & Skip Filter Chains

Esempio:

public void doFilter(ServletRequest req, ServletResponse res, 
        FilterChain chain) throws IOException, ServletException { 

    HttpServletRequest request = (HttpServletRequest) req; 
    final String val = request.getHeader(FOO_TOKEN) 

    if(val == null || !val.equals("FOO")) { 
     // token is not valid, return an HTTP 401 error code 
     ... 
    } 
    else { 
    // token is good, let it proceed 
    chain.doFilter(req, res); 
    } 

quanto ho capito, ho potuto effettuare le seguenti operazioni:

(1) ((HttpServletResponse) res).setStatus(401) e saltare la catena dei filtri rimanente

O

(2) laterale un'eccezione che, alla fine, porta a Spring Security lanciando un errore 401 al client.

Se # 1 è l'opzione migliore, come posso saltare la catena di filtri dopo aver chiamato setStatus(401) nella risposta?

Oppure, se la # 2 è la giusta strada da percorrere, quale eccezione dovrei lanciare?

+1

Se si ritorna dal metodo dopo 'setStatus' che interrompe l'ulteriore elaborazione della richiesta. La catena di filtri procede solo se chiami "chain.doFilter". –

+0

Grazie Luca. Ci proverò. Pubblica come risposta? Puoi anche postare un riferimento per poter leggere di più? –

risposta

10

Dal API docs for the doFilter method, è possibile:

  • O invocare il prossimo soggetto della catena utilizzando l'oggetto FilterChain (chain.doFilter()),
  • o non passa alla richiesta/coppia di risposte all'entità successiva nella catena di filtri per bloccare l'elaborazione della richiesta

quindi impostare il codice di stato della risposta e tornare immediatamente senza invocare chain.doFilter è l'opzione migliore per ciò che desideri ottenere qui.

2

Suggerisco questa soluzione di seguito.

public void doFilter(ServletRequest req, ServletResponse res, 
         FilterChain chain) throws IOException, ServletException { 

     HttpServletRequest request = (HttpServletRequest) req; 
     final String val = request.getHeader(FOO_TOKEN) 

     if (val == null || !val.equals("FOO")) { 
      ((HttpServletResponse) response).sendError(HttpServletResponse.SC_UNAUTHORIZED, "The token is not valid."); 
     } else { 
      chain.doFilter(req, res); 
     } 
    } 
Problemi correlati