Jax-RS - фильтр ContainerResponseFilter только иногда срабатывает - PullRequest
0 голосов
/ 08 мая 2018

Я пытаюсь создать веб-сервер и получить к нему доступ из веб-приложения с другим источником. Поэтому я добавил фильтр CORS для разрешения запросов CORS, который выглядит следующим образом:

@Provider
public class CORSFilter implements ContainerResponseFilter {

    private static final List<String> allowedOrigins = new ArrayList<>(Arrays.asList(
            "http://127.0.0.1:8080",
            "127.0.0.1:8080",
            "http://localhost:8080",
            "localhost:8080"
    ));
    private static final String defaultOrigin = "http://127.0.0.1:8080";

    private static final Logger logger = LoggerFactory.getLogger(CORSFilter.class);

    @Override
    public void filter(final ContainerRequestContext requestContext,
                       final ContainerResponseContext cres) throws IOException {
        final String requestOrigin = requestContext.getHeaders().getFirst("Origin");
        logger.info("CORS filter triggered; origins = " + requestOrigin + ", request = "
                + requestContext.getUriInfo().getPath());
        final String acceptedOrigin = allowedOrigins.contains(requestOrigin) ? requestOrigin : defaultOrigin;
        cres.getHeaders().add("Access-Control-Allow-Origin", acceptedOrigin);
        cres.getHeaders().add("Access-Control-Allow-Headers", "origin, content-type, accept, authorization");
        cres.getHeaders().add("Access-Control-Allow-Credentials", "true");
        cres.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD");
        cres.getHeaders().add("Access-Control-Max-Age", "1209600");
    }
}

К сожалению, filter, кажется, иногда срабатывает, а когда я говорю иногда , это действительно непредсказуемо: он будет работать в течение 1 или 2 часов, а затем перестанет работать только для запросов GET, тогда работают только для анонимных (без аутентификации) запросов и т. д.

В браузере появляется следующая ошибка:

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://127.0.0.1:18080/users-service/rest/users/by_ids. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing).

Еще несколько важных моментов:

  • Я использую Shiro для аутентификации и обеспечения доступа к ресурсам
  • Все мои запросы всегда работают с почтальоном
...