В запрошенном ресурсе нет заголовка "Access-Control-Allow-Origin" - Resteasy
Я работаю над веб-приложением, включающим UI- Angular, Server-Java, RestEasy 3.0.9.Final для вызовов rest api
Когда я попытался получить доступ к сервису rest из другого домена, я стал ниже ошибки
НЕ МОЖЕТ ЗАГРУЗИТЬ. Ответ на запрос перед полетом не проходит проверку контроля доступа. Нет заголовка "Access-Control-Allow-Origin" на запрошенном ресурсе. Поэтому исходный http://localhost:8080 'не допускается.
Я настроил серверную часть для ответа на вызовы с перекрестными доменами, и это работает с GET-вызовом, но POST-вызов создает ERROR
web.xml
<context-param>
<param-name>resteasy.providers</param-name>
<param-value>com.test.sample.app.CorsFeature</param-value>
</context-param>
<listener>
<listener-class>
org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>resteasy-servlet</servlet-name>
<servlet-class>
org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.test.sample.app.Application</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>resteasy-servlet</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
<context-param>
<param-name>resteasy.servlet.mapping.prefix</param-name>
<param-value>/rest</param-value>
</context-param>
<context-param>
<param-name>resteasy.scan</param-name>
<param-value>true</param-value>
</context-param>
Класс обслуживания
@GET
@Path("/getnameAtt")
@Produces(MediaType.APPLICATION_JSON)
public Response getHostnameAttributes() {
return Response
.status(200)
.header("Access-Control-Allow-Origin", "*")
.header("Access-Control-Allow-Headers",
"origin, content-type, accept, authorization")
.header("Access-Control-Allow-Credentials", "true")
.header("Access-Control-Allow-Methods",
"GET, POST, PUT, DELETE, OPTIONS, HEAD")
.header("Access-Control-Max-Age", "1209600")
.entity(new TestImpl().getHostNameAttributes())
.build();
}
@POST
@Path("/getSeq")
@Produces(MediaType.APPLICATION_JSON)
public Response getCurrentSequence(String request) {
return Response
.status(200)
.header("Access-Control-Allow-Origin", "*")
.header("Access-Control-Allow-Headers",
"origin, content-type, accept, authorization")
.header("Access-Control-Allow-Credentials", "true")
.header("Access-Control-Allow-Methods",
"GET, POST, PUT, DELETE, OPTIONS, HEAD")
.header("Access-Control-Max-Age", "1209600")
.entity(new TestImpl().getCurrentSeq(request))
.build();
}
Поскольку я новичок в resteasy, не в состоянии понять, почему это не работает.
Любая помощь будет принята с благодарностью. Ожидание вашего ответа.
Спасибо
Ответы
Ответ 1
Ваши методы ресурсов не пострадают, поэтому их заголовки никогда не будут установлены. Причина в том, что есть запрос, который называется предполетным запросом перед фактическим запросом, который является запросом OPTIONS
. Таким образом, ошибка возникает из-за того, что запрос предполетной обработки не создает необходимые заголовки.
Для RESTeasy вы должны использовать CorsFilter
. Вы можете увидеть здесь для примера, как его настроить. Этот фильтр будет обрабатывать запрос перед полетом. Таким образом, вы можете удалить все те заголовки, которые у вас есть в ваших ресурсных методах.
См. также:
Ответ 2
Кажется, что ваш ресурс POST
не будет удален, как упоминается @peeskillet. Скорее всего, ваш запрос ~ POST ~ не будет работать, потому что это может быть не простой запрос. Единственными простыми запросами являются GET, HEAD или POST, а заголовки запросов просты (единственными простыми заголовками являются Accept, Accept-Language, Content-Language, Content-Type = application/x-www-form-urlencoded, multipart/form-data, text/plain).
Поскольку вы уже добавляете заголовки Access-Control-Allow-Origin
к вашему ответу, вы можете добавить новый метод OPTIONS
в свой класс ресурсов.
@OPTIONS
@Path("{path : .*}")
public Response options() {
return Response.ok("")
.header("Access-Control-Allow-Origin", "*")
.header("Access-Control-Allow-Headers", "origin, content-type, accept, authorization")
.header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD")
.header("Access-Control-Max-Age", "2000")
.build();
}