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?
+1 Gut gestellte Frage zu bekommen. –