Почему CORSFilter конфликтует с ExceptionMapper <Throwable>? - PullRequest
1 голос
/ 31 января 2020

У меня есть это Java приложение с шиповником, где я хотел перехватить все необработанные исключения.

Я хотел ответить 500 вместо страницы ошибок по умолчанию, которую дает JAXRS, поэтому я просто использовал реализацию ExceptionMapper<Throwable>.

Провел тестирование с использованием Postman без проблем, но как только я попытался сделать вызов AJAX в браузере, я закончил посылкой запроса OPTIONS, который не выполняется.

Также реализована часть CORS на стороне приложения путем реализации ContainerResponseFilter.

У меня такое ощущение, что СООТВЕТСТВИЕ происходит на ранней стадии запроса, и только позже CORSFilter влияет на ответ.

Мало что я уже пробовал:

  • @ PreMatching
  • @ Priority
  • Пытался импортировать jboss.resteasy CorsFilter
  • Пытался отфильтровать исключения по exception instanceof DefaultOptionsMethodException, но в итоге выяснил, что DefaultOptionsMethodException отсутствует в classpath, и его внутренний (?) пакет включен в thorntails classpath (??)
  • ...
// CORSFilter
package com.testapplication.test.rest;

import java.io.IOException;

import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.ext.Provider;

@Provider
public class CORSFilter implements ContainerResponseFilter {
    @Override
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
        responseContext.getHeaders().add("Access-Control-Allow-Origin", "*");
        responseContext.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
        responseContext.getHeaders().add("Access-Control-Max-Age", "-1");
        responseContext.getHeaders().add("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    }
}
// UncaughtExceptionMapper
package com.testapplication.test.rest;

import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;

@Provider
public class UncaughtExceptionMapper extends Throwable implements ExceptionMapper<Throwable> {
    @Override
    public Response toResponse(Throwable exception) {
        exception.printStackTrace();
        return Response.status(500).entity("{\"message\": \"a\"}").build();
    }
}

Пример репозитория: https://github.com/trimpirim/cors-filter-conflict-exception-mapper

1 Ответ

0 голосов
/ 31 января 2020

Попробуйте фильтр внизу этого поста . Простое использование фильтра ответов не будет работать правильно в отношении взаимодействия CORS. Фильтр запросов также необходим для отмены запроса на предварительные запросы.

...