Я пытаюсь создать веб-сервер и получить к нему доступ из веб-приложения с другим источником. Поэтому я добавил фильтр 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 для аутентификации и обеспечения доступа к ресурсам
- Все мои запросы всегда работают с почтальоном