访问控制允许来源 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,这是允许的。我真的不知道它是如何工作的,但确实如此,而且很正常。
如果您使用本地托管的应用程序只是为了测试目的,并且服务和应用程序都具有相同的来源,那么您有两个简单的解决方案:
- 您可以 运行 禁用网络安全的网络浏览器(例如 Chrome):
Disable same origin policy in Chrome。这将禁用 CORS 并消除问题。
- 您可以安装名为 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);
}
}
我正在使用 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,这是允许的。我真的不知道它是如何工作的,但确实如此,而且很正常。
如果您使用本地托管的应用程序只是为了测试目的,并且服务和应用程序都具有相同的来源,那么您有两个简单的解决方案:
- 您可以 运行 禁用网络安全的网络浏览器(例如 Chrome): Disable same origin policy in Chrome。这将禁用 CORS 并消除问题。
- 您可以安装名为 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);
}
}