Spring CORS дает сбой ТОЛЬКО на некоторых ресурсах - PullRequest
0 голосов
/ 16 декабря 2018

У меня есть веб-сервис RESTful с большим количеством различных ресурсов (конечных точек), которые прекрасно работают при вызове из Почтальона.Однако только некоторые из них работают из браузера, тогда как остальные не работают.Я не могу обнаружить какой-либо шаблон в URL-адресах, которые дают сбой, и URL-адресов, которые не дают сбой.

Я вызываю ресурс непосредственно из консоли Chrome.

Например, эторесурс, который выходит из браузера, но работает из Почтальона - / api / hello / .

fetch("https://myapp.herokuapp.com/api/hello/", {method: "GET", headers: {"authToken" : "7c577770c0b7f1b2ba0f7dbb10ae247978a9997cf8aec3bbab0ac7de409e0b4c"}})
.then(res => res.json())  
.then(console.log)

Например, этот ресурс работает как из Почтальона, так и из Chrome.

fetch("https://myapp.herokuapp.com/api/user/all/", {method: "GET", headers: {"authToken" : "7c577770c0b7f1b2ba0f7dbb10ae247978a9997cf8aec3bbab0ac7de409e0b4c"}})
.then(res => res.json())  
.then(console.log)

Для ресурса, который не удалось, Chrome зарегистрировал следующую ошибку:

Access to fetch at 'https://myapp.herokuapp.com/api/hello/' from origin 'http://admin.myapp.com' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.

Я заметил, что точно такое же сообщение появляется, если я пытаюсь получить ресурс, который на самом деле не существуетв моем сервисе, например, вызов / api / blabla / приводит к точно такой же ошибке.

Моя конфигурация CORS в Spring выглядит следующим образом.

@Component
public class SimpleCORSFilter implements Filter {

    private static final String DEFAULT_ORIGIN = "https://admin.myapp.com";

    private static final Set<String> allowedOrigins = new HashSet<>();
    static {
        allowedOrigins.add(DEFAULT_ORIGIN);
        allowedOrigins.add("http://admin.myapp.com");
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) res;
        HttpServletRequest request = (HttpServletRequest) req;

        final String origin = request.getHeader("Origin");

        if (origin != null && allowedOrigins.contains(origin)) {
            // set origin to our specific domain to disallow request from other sites
            response.setHeader("Access-Control-Allow-Origin", origin);
        } else {
            // set origin to our default allowed
            response.setHeader("Access-Control-Allow-Origin", DEFAULT_ORIGIN);
        }

        response.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", String.format("%s, %s", "Content-Type", HEADER_AUTH_TOKEN));

        chain.doFilter(req, res);
    }

    @Override
    public void init(FilterConfig filterConfig) {
    }

    @Override
    public void destroy() {
    }

Iможно увидеть, что заголовки ответа идеально настроены на любой вызов из Почтальона и для вызовов из Chrome, которые не сообщают об ошибке.Однако при вызовах из Chrome, которые действительно сообщают об ошибке, Access-Control-Allowed-Methods содержит только GET.

TL; DR - я понятия не имею, почему вызовы CORS из браузера не работают только для некоторых ресурсов,в то время как для других ресурсов он работает нормально.

1 Ответ

0 голосов
/ 16 декабря 2018

Spring автоматически обрабатывает запросы CORS preflight .

Но вы на самом деле не используете Функциональность CORS Spring , поэтому вам следует обрабатывать запросы OPTIONS, возвращая HTTP 200 OK.

Примерно так:

    if ("OPTIONS".equals(req.getMethod())) {
        res.setStatus(HttpServletResponse.SC_OK);
    } else {
        chain.doFilter(req, res);
    }

(хотя я не думаю, что это коренная причина вашей проблемы)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...