访问控制允许来源 ATG 休息 API

Access-Control-Allow-Origin ATG Rest API

我正在使用 angularjs 和 ATG Rest API 构建门户,当我尝试使用 API:[=16= 获取会话确认编号时出现错误]

Error:XMLHttpRequest cannot load http://IPNUMBER:Port/rest/model/atg/rest/SessionConfirmationActor/getSessionConfirmationNumber. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost' is therefore not allowed access.

API 在 POSTMAN 中和直接浏览器查询中工作正常。 请帮我解决这个问题。

我没用过这个API,但问题很常见。在这里查看示例(或有关 CORS 的任何其他来源):

How does Access-Control-Allow-Origin header work?

如果您的 Web 应用程序和服务具有不同的域(来源),则在服务允许您的应用程序请求数据之前,这将不起作用。当您使用 Postman 时它会起作用,因为 Postman 不发送 header 或使用 origin,这是允许的。我真的不知道它是如何工作的,但确实如此,而且很正常。

如果您使用本地托管的应用程序只是为了测试目的,并且服务和应用程序都具有相同的来源,那么您有两个简单的解决方案:

  1. 您可以 运行 禁用网络安全的网络浏览器(例如 Chrome): Disable same origin policy in Chrome。这将禁用 CORS 并消除问题。
  2. 您可以安装名为 Allow-Control-Allow-Origin 的 Chrome 扩展:*。启用后,它会发送服务允许的来源。

但是,如果您的服务有不同的来源,则您必须对其进行配置以允许您的应用程序请求它。


编辑

注意一件事。如果您发送不同于 GET 的请求或使用一些自定义 headers,浏览器将首先发送一个 OPTIONS 请求。这称为预检请求。您的服务必须处理它才能正常工作。

最好的办法是编写一个简单的 Pipeline servlet 并将其添加到 RestPipeline 配置中。 servlet 只会将 cors headers 注入所有 Rest 请求。

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import atg.servlet.*;
import atg.servlet.pipeline.*;

public class CORSHeaderServlet extends InsertableServletImpl{
  public CORSHeaderServlet () {}
  public void service (DynamoHttpServletRequest request,
                       DynamoHttpServletResponse response)
       throws IOException, ServletException
  {
     //add headers to response.
    response.addHeader("Access-Control-Allow-Origin" ,"*");
    passRequest (request, response);
  }
}