2012-05-30 10 views
5

Ho un'app jersey configurata con autenticazione di gestione Spring Security. Il pacchetto jersey-spring sta fornendo la classe SpringServlet registrata nel mio web.xml come servlet.Gestione eccezioni jersey e filtro

Autenticazione e tutto funziona come previsto. Quello che mi chiedo è come avere le AuthenticationExceptions (e altre eccezioni di filtro) inviate tramite il servlet di Jersey, così posso usare il nostro ExceptionMapper per elaborarle.

Originariamente lo SpringServlet era configurato come un filtro, ma dopo aver fatto qualche lettura ho capito che un servlet dovrebbe essere in grado di gestire le eccezioni generate nei filtri (forse è una comprensione errata). Non noto alcun cambiamento nel comportamento dopo averlo modificato in un servlet e, se si traccia il codice Spring Security, è possibile vedere dove viene scritto HttpServletResponse.

La mia domanda: è possibile avere le eccezioni del processo servlet di Jersey generate dal filtro Spring Security?

+0

Ciao Nick, è possibile pubblicare un SSCCE che dimostri la propria configurazione? –

+0

Sì, aggiungerò un piccolo campione non appena ne avrò la possibilità. –

risposta

0

Il modo in cui lo fai dipende se stai invocando Jersey da Spring Security o Spring Security da Jersey.

Se si richiama Spring Security dall'interno del contenitore Jersey, non è necessario fare altro che definire un programma di analisi delle eccezioni per l'eccezione appropriata.

Se si richiama Jersey solo dopo che il client ha superato i filtri Spring Security, quindi eventuali eccezioni generate mentre la richiesta del client passa attraverso tali filtri non verranno catturate da Jersey (poiché la richiesta non è ancora stata inserita nel contenitore Jersey) . Un modo per "ottenere" l'eccezione nel contenitore Jersey è quello di:

  1. pescato del AuthenticationException in un filtro di autenticazione personalizzato e invocare il metodo AuthenticationFailureHandler.onAuthenticationFailure() (passando l'eccezione), e assicurarsi di spezzare la catena del filtro non invocando FilterChain.doFilter()
  2. configurare il AuthenticationFailureHandler per chiamare una risorsa Jersey del vostro disegno che recupererà (e poi ri-throw) eventuali eccezioni generate da primavera con HttpServletRequest.getAttribute(WebAttributes.AUTHENTICATION_EXCEPTION)

Ci possono essere altri modi per "ottenere" l'eccezione in Jersey-land, ma questo è un modo che ha funzionato per me in passato.

+0

Grazie per la risposta a questa domanda davvero vecchia; il problema rimane, ma darò il tuo suggerimento una prova appena possibile. Comunque non ho lavorato al progetto per un po 'di tempo! –

+0

Oops, non si rendeva conto che il problema era così vecchio .. – maxenglander