RESTful webservice:如何在java中设置头文件以接受Access-Control-Allow-Origin允许的XMLHttpRequest

时间:2013-08-14 14:22:26

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

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

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

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

  

XMLHttpRequest无法加载url不允许使用Origin localhost       通过Access-Control-Allow-Origin

我该如何处理这个问题?

Java代码:

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

1 个答案:

答案 0 :(得分:38)

请在此处阅读有关您的问题的信息: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")之类的内容而不是星号"*"