2013-09-03 11 views
5

Was versuche ich zu tun?Servlet-Filter funktioniert nicht, wenn eine Ausnahme ausgelöst wird

ich neue timestamped Token von Server-Seite zu erzeugen versuche, dass der Client in ihre spätere Anfrage

Was habe ich versucht haben, nicht verwenden kann?

Ich habe einen Servlet-Filter, der um REST Anrufe wickelt und sieht aus wie

@WebFilter(urlPatterns = "/rest/secure") 
public class SecurityFilter implements Filter { 

    private static final Pattern PATTERN = Pattern.compile(":"); 
    private static final Logger LOGGER = LoggerFactory.getLogger(SecurityFilter.class); 

    @Override 
    public void init(final FilterConfig filterConfig) throws ServletException { 
     //LOGGER.info("initializing SecurityFilter"); 
    } 

    @Override 
    public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) throws IOException, ServletException { 
     final HttpServletResponse httpServletResponse = (HttpServletResponse) response; 
     final String authToken = getAuthenticationHeaderValue((HttpServletRequest) request); 

     try { 
      validateAuthToken(authToken); 
     } catch (IllegalArgumentException tokenNotValidException) { 
      LOGGER.error("invalid token"); 
      httpServletResponse.sendError(401); 
     } 

     try { 
      chain.doFilter(request, response); 
     } catch (Exception e) { 
      LOGGER.error("exception: " + e.getMessage()); 
     }finally { 
      final String newAuthToken = generateNewAuthToken(authToken); 
      httpServletResponse.addHeader(AUTH_TOKEN, newAuthToken); 
      LOGGER.info("added new security token: " + newAuthToken); 
     } 
    } 

und in einem meiner Endpunkte ich

@PUT 
public Response updateUser() { 
    throw new IllegalArgumentException("just for test purposes"); 
} 

I RESTEasy für alle REST basierte Arbeit verwende.

und ich bin auch mit Seam REST Bibliothek Server Ausnahmen von REST basierten Ausnahmen

@ExceptionMapping.List({ 
     @ExceptionMapping(exceptionType = IllegalArgumentException.class, status = 400, useExceptionMessage = true), 
     @ExceptionMapping(exceptionType = PersistenceException.class, status = 400, useExceptionMessage = true), 
     @ExceptionMapping(exceptionType = ConstraintViolationException.class, status = 400, useExceptionMessage = true), 
     @ExceptionMapping(exceptionType = ValidationException.class, status = 400, useExceptionMessage = true), 
     @ExceptionMapping(exceptionType = NoResultException.class, status = 404, useExceptionMessage = true), 
     @ExceptionMapping(exceptionType = IllegalStateException.class, status = 406, useExceptionMessage = true), 
     @ExceptionMapping(exceptionType = NoClassDefFoundError.class, status = 404, useExceptionMessage = true), 
     @ExceptionMapping(exceptionType = UnsupportedOperationException.class, status = 400, useExceptionMessage = true), 
}) 
@ApplicationPath("/rest") 
public class MarketApplicationConfiguration extends Application { 
} 

Problem Karte?
- Wenn der Endpunkt die Ausnahme auslöst, wird der Rückruf nie an den Filtercode zurückgegeben.
- Dies ist, auch wenn ich try/catch/finally verwenden als

 try { 
       chain.doFilter(request, response); 
      } catch (Exception e) { 
       LOGGER.error("exception: " + e.getMessage()); 
      }finally { 
       final String newAuthToken = generateNewAuthToken(authToken); 
       httpServletResponse.addHeader(AUTH_TOKEN, newAuthToken); 
       LOGGER.info("added new security token: " + newAuthToken); 
      } 

folgt - Ich kann jedoch prüfen, ob der IllegalArgumentException-HTTP 400 basierend auf Seam REST Ausnahme Mapping abgebildet wird, aber es wird nie wieder zurück zum SecurityFilter Code bei Serverausnahmen

Erforderlich?
- Ich möchte Server-Token generieren, auch wenn die Anwendung Ausnahmen ausgibt, damit der Client sie verwenden kann
- Wie kann ich im Falle von Ausnahmen meine Antwort über SecurityFilter routen?

+2

+1 Gut gestellte Frage zu bekommen. –

Antwort

0

Ich denke, dass Sie für diesen Zweck eigenen Ausnahmen-Handler verwenden sollten, der in web.xml definiert werden kann, und im Falle einer Ausnahme sollten Sie es innerhalb des Ausnahme-Handlers und nicht im Filter verarbeiten.

können Sie mehr Details im Artikel "Servlets - Exception Handling"

+0

Dies ist, was von '@ ExceptionMapping' in meinem Code oben behandelt wird – daydreamer