当前位置: 首页 > 面试题库 >

RESTful Web服务:如何在Java中设置标头以接受Access-Control-Allow-Origin允许的XMLHttpRequest

王长卿
2023-03-14
问题内容

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

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

在控制台中,它显示以下错误消息:

XMLHttpRequest无法加载url Access-Control-Allow-Origin不允许起源localhost

我该如何处理这个问题?

Java代码:

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

问题答案:

在这里阅读有关您的问题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”标头与您访问此资源的自定义域交换。Ig如果您http://localhost::8080使用这样的名称("Access-Control- Allow-Origin", "http://localhost:8080")而不是星号来调用它"*"



 类似资料:
  • Response.AddHeader(“Access-Control-Allow-Origin”,“*”)是如何实现的;行设置多个标题时,包括,但没有当我删除它?

  • null 服务器的响应如下: XMLHttpRequest无法加载http://nqatalog.negroesquisso.pt/login.php。Access-Control-Allow-Origin不允许Origin 。 如何解决此问题?

  • 问题内容: 我是Ajax的新手,只是受过此跨域调用的任务。我们的网页上有一个文本框,用户可用来执行公司名称搜索。通过单击文本框旁边的按钮,将请求Ajax调用。不幸的是,Web服务位于单独的域中,因此自然会引起问题。 以下是我使这项工作的最佳尝试。我还要注意,此调用的目的是以XML格式返回结果,该结果将在请求的一部分中进行解析。 这又是错误消息: 对于解决方法,我不知所措,将不胜感激任何想法。 问题

  • 问题内容: 我正在使用Sencha Touch 2应用程序(包装在PhoneGap中)到远程PHP服务器。 服务器的响应如下: XMLHttpRequest无法加载http://nqatalog.negroesquisso.pt/login.php。原产地不被访问控制允许来源允许的。 我该如何解决这个问题? 问题答案: 不久前,我写了一篇有关此问题的文章Cross Domain AJAX 。 如果

  • 我试图使用原始JSON发出一个POST请求来松弛API,但我一直得到以下错误

  • 问题内容: 显然,我完全误解了它的语义。我想到了这样的事情: 客户端从http:// siteA- origin 下载javascript代码MyCode.js 。 MyCode.js的响应标头包含 Access-Control-Allow-Origin:http:// siteB ,我认为这意味着MyCode.js被允许对站点B进行跨域引用。 客户端触发了MyCode.js的某些功能,该功能继而