rest - 请求的资源上不存在 'Access-Control-Allow-Origin' header -Resteasy

标签 rest cors resteasy

我正在使用包含UI-Angular,Server-Java,RestEasy 3.0.9.Final的REST API调用的Web应用程序

当我尝试从另一个域访问其余服务时,出现以下错误

无法加载对预检请求的响应未通过访问控制检查:所请求的资源上不存在“Access-Control-Allow-Origin” header 。因此,不允许访问源'http://localhost:8080'。

我将服务器端配置为响应跨域调用,这与GET调用一起工作,但POST调用正在创建错误

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的新手,所以无法弄清楚为什么它不起作用。
任何帮助将不胜感激 。等待您的答复。

谢谢

最佳答案

您的资源方法不会被命中,因此它们的标题将永远不会被设置。原因是实际请求之前有一个所谓的预检请求,即OPTIONS请求。因此,错误来自以下事实:预检请求未生成必要的 header 。

对于RESTeasy,应使用 CorsFilter 。您可以在here上看到一些如何配置它的示例。该过滤器将处理预检请求。因此,您可以删除资源方法中所有的 header 。

另请参见:

  • HTTP access control (CORS)
  • 关于rest - 请求的资源上不存在 'Access-Control-Allow-Origin' header -Resteasy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33164596/

    相关文章:

    Django rest 框架在serializer.py 或views.py 中编写复杂逻辑的位置?

    authentication - Wildfly 8 基本身份验证

    具有电话号码验证要求的 RESTful 身份验证

    带有 Spring 的 Android REST 处理太长的请求

    node.js - 使用 POST API 时出现多个 CORS 错误

    node.js - 当使用来自不同本地主机端口的 GET api 时,本地主机上的 Angular 收到 404 - CORS 问题?

    c# - 使用 asp.net web api 2 odata 和 Breeze 的 CORS

    jax-rs - 为什么 JAX-RS Response.fromResponse(anotherResponse) 不复制实体?

    rest - JAX-RS:验证 JSON 和 XML (RESTEasy)

    rest - 谷歌日历 API : TimeZone not taken into account by google server?