【问题标题】:RESTful webservice : how to set headers in java to accept XMLHttpRequest allowed by Access-Control-Allow-OriginRESTful webservice:如何在 java 中设置标头以接受 Access-Control-Allow-Origin 允许的 XMLHttpRequest
【发布时间】:2013-08-16 13:27:54
【问题描述】:

我有一个 RESTful 网络服务,它将返回字符串,它是用 Java (JAX-WS) 编写的。 我的问题是当我使用以下 URL 向该 Web 服务发送请求时:

http://localhost:8080/project/webservices/getlist/getListCustomers

在控制台中,它给了我以下错误消息:

XMLHttpRequest 无法加载 url Origin localhost is not allowed 通过访问控制允许来源

我该如何处理这个问题?

Java 代码:

@GET
@Path("/getsample")
public Response getMsg() { 
    String output = "Jersey say : " ;   
    return Response.status(200).entity(output).build();
}

【问题讨论】:

  • 你的意思是 JAX-RS。 JAX-WS 是一种 SOAP。

标签: java rest jax-ws jax-rs cors


【解决方案1】:

在此处阅读有关您的问题 CORS 的信息:http://enable-cors.org/

检查这个是否对您的 getMsg() 方法有帮助:
return Response.ok(output).header("Access-Control-Allow-Origin", "*").build();

如果上述方法不起作用,请尝试将 Jersey 过滤器添加到您的服务中。创建过滤器类:

package your.package;

public class CORSFilter implements ContainerResponseFilter {

    @Override
    public ContainerResponse filter(ContainerRequest creq, ContainerResponse cresp) {

        cresp.getHttpHeaders().putSingle("Access-Control-Allow-Origin", "*");
        cresp.getHttpHeaders().putSingle("Access-Control-Allow-Credentials", "true");
        cresp.getHttpHeaders().putSingle("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT, OPTIONS, HEAD");
        cresp.getHttpHeaders().putSingle("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With");

        return cresp;
    }
}

稍后注册 win web.xml:

<servlet>
<servlet-name>CORS Filter</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
 <init-param>
    <param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
    <param-value>your.package.CORSFilter</param-value>
 </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>CORS Filter</servlet-name>
    <url-pattern>/webservices/*</url-pattern>
</servlet-mapping>


另一种解决方案是在资源中使用此代码为浏览器提供OPTIONS。把它放在你有@GET 的类中。
  @OPTIONS
  @Path("/getsample")
  public Response getOptions() {
    return Response.ok()
      .header("Access-Control-Allow-Origin", "*")
      .header("Access-Control-Allow-Methods", "POST, GET, PUT, UPDATE, OPTIONS")
      .header("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With").build();
  }


如果这不起作用,请尝试将为“Access-Control-Allow-Origin”标头提供的"*" 与您访问此资源的自定义域交换。举例如果您从 http://localhost::8080 调用它,请使用类似 ("Access-Control-Allow-Origin", "http://localhost:8080") 的名称,而不是星号 "*"

【讨论】:

  • 此更改适用于 IE,不适用于 chrome 仍然是同样的问题
  • 经过长期研究,您的解决方案似乎更好更好,感谢您的回复,如果您找到任何永久解决方案,请随时更新。
  • 我上次遇到了同样的 CORS 问题。我对互联网上的许多解决方案感到惊讶。每个人都有适合他的东西。对我来说,泽西过滤器效果很好。永久解决方案将是适合您的解决方案。你能运行其余的请求吗?
  • 是的,休息请求工作正常,没有问题,但只有当我从 ajax 请求启动它时才会出现问题。
  • GET 工作正常,但是当我尝试 POST 时,我得到“对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许访问源“localhost”。错误。我该如何解决?
猜你喜欢
  • 2014-06-09
  • 2013-04-12
  • 2019-06-19
  • 1970-01-01
  • 2019-08-15
  • 2015-03-21
  • 2013-01-24
  • 2015-06-17
  • 1970-01-01
相关资源
最近更新 更多