Я не знаю никакой стандартной поддержки CORS с Джерси. @CrossOriginResourceSharing
, насколько я могу судить, является аннотацией CXF. Поэтому я не совсем уверен, как вы используете эту аннотацию с Джерси.
С Джерси, чтобы обращаться с CORS, я обычно использую ContainerResponseFilter
. ContainerResponseFilter
для Джерси 1 и 2 немного отличаются. Поскольку вы не указали, какую версию вы используете, я отправлю оба.
import java.io.IOException;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
@Provider
public class CORSFilter implements ContainerResponseFilter {
@Override
public void filter(ContainerRequestContext request,
ContainerResponseContext response) throws IOException {
response.getHeaders().add("Access-Control-Allow-Origin", "*");
response.getHeaders().add("Access-Control-Allow-Headers",
"origin, content-type, accept, authorization");
response.getHeaders().add("Access-Control-Allow-Credentials", "true");
response.getHeaders().add("Access-Control-Allow-Methods",
"GET, POST, PUT, DELETE, OPTIONS, HEAD");
}
}
Если вы используете сканирование пакетов для обнаружения поставщиков и ресурсов, @Provider
аннотация должна заботиться о конфигурации для вас. Если нет, то вам нужно будет явно зарегистрировать его с помощью подкласса ResourceConfig
или Application
.
Пример кода для явного регистрации фильтра с помощью ResourceConfig
:
final ResourceConfig resourceConfig = new ResourceConfig();
resourceConfig.register(new CORSFilter());
final final URI uri = ...;
final HttpServer httpServer = GrizzlyHttpServerFactory.createHttpServer(uri, resourceConfig);
import com.sun.jersey.spi.container.ContainerRequest;
import com.sun.jersey.spi.container.ContainerResponse;
import com.sun.jersey.spi.container.ContainerResponseFilter;
public class CORSFilter implements ContainerResponseFilter {
@Override
public ContainerResponse filter(ContainerRequest request,
ContainerResponse response) {
response.getHttpHeaders().add("Access-Control-Allow-Origin", "*");
response.getHttpHeaders().add("Access-Control-Allow-Headers",
"origin, content-type, accept, authorization");
response.getHttpHeaders().add("Access-Control-Allow-Credentials", "true");
response.getHttpHeaders().add("Access-Control-Allow-Methods",
"GET, POST, PUT, DELETE, OPTIONS, HEAD");
return response;
}
}
web.xml, вы можете использовать
com.sun.jersey.spi.container.ContainerResponseFilters
com.yourpackage.CORSFilter
Или ResourceConfig
вы можете сделать
resourceConfig.getContainerResponseFilters().add(new CORSFilter());
Или сканирование пакета с помощью аннотации @Provider
.
Обратите внимание, что приведенный выше пример может быть улучшен. Вам нужно будет узнать больше о том, как работает CORS. См. здесь . Во-первых, вы получите заголовки для всех ответов. Это может быть нежелательно. Возможно, вам просто нужно обработать предполетный (или ОПЦИИ). Если вы хотите увидеть улучшенный фильтр CORS, вы можете проверить исходный код для RESTeasy CorsFilter