Подтвердить что ты не робот

В запрошенном ресурсе нет заголовка "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, не в состоянии понять, почему это не работает. Любая помощь будет принята с благодарностью. Ожидание вашего ответа.

Спасибо

4b9b3361

Ответ 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();
}