【问题标题】:Access-Control-Allow-Origin ATG Rest API访问控制允许来源 ATG 休息 API
【发布时间】:2016-05-26 10:49:10
【问题描述】:

我正在使用 angularjs 和 ATG Rest API 构建门户,当我尝试使用 API:rest/model/atg/rest/SessionConfirmationActor/getSessionConfirmationNumber 获取会话确认号时出现错误

错误:XMLHttpRequest 无法加载 http://IPNUMBER:Port/rest/model/atg/rest/SessionConfirmationActor/getSessionConfirmationNumber。请求的资源上不存在“Access-Control-Allow-Origin”标头。 Origin 'http://localhost' 因此不允许访问。

API 在 POSTMAN 和直接浏览器查询中运行良好。 请帮助我。

【问题讨论】:

    标签: angularjs weblogic11g atg


    【解决方案1】:

    最好的办法是编写一个简单的 Pipeline servlet 并将其添加到 RestPipeline 配置中。 servlet 只会将 cors 标头注入所有 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);
      }
    }
    

    【讨论】:

    • 感谢您的回复,我正在使用 ATG 网络商务,并且在其中启用了 REST API,不确定在哪里编写 Pipeline servlet,希望 ATG 在某些地方具有相同的功能。
    • 我从 Oracle 论坛得到了一个答案,但不知道该怎么做,这里是链接 community.oracle.com/message/13287142#13287142,上面写着,扩展任何一个 DAF 管道 servlet(通过使用 InsertableServletImpl)并设置根据业务要求标头。
    【解决方案2】:

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

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

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

    如果您仅出于测试目的而使用本地托管的应用程序,并且服务和应用程序将具有相同的来源,那么您有两个简单的解决方案:

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

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


    编辑

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

    【讨论】:

    • 我正在使用 WEB LOGIC,是否需要更改 ATG API 配置或 WEB LOGIC 中的任何内容才能使其正常工作?因为我有一个 android 应用程序也可以连接到相同的 API。否则我会在同一台服务器上托管 Angular 项目 :)
    • 正如我所说,我不知道 API,所以我不能确切地知道该怎么做。我可以说,目标是从服务发送标头做出响应,例如:Access-Control-Allow-Origin: ** 允许所有应用程序请求服务。您可以输入具体的域名,而不是*。我想api的配置中应该有一些东西可以允许它。如果没有,您可能可以手动将标头添加到每个响应中(例如,通过使用某些继承)。或者也许使用一些过滤器 - 我现在只是在猜测。请记住将其也添加到 OPTIONS 请求中以使其正常工作。
    • 但是我对 weblogic 很陌生,请帮我调整 weblogic 安全组或在 weblogic 中添加 Access-Control-Allow-Origin: *
    • 我真的很想帮助你,但我也不熟悉你使用的工具。目前我唯一想到的是创建一个过滤器,它将为服务中的每个响应添加标头。像这里的东西:amodernstory.com/2014/12/27/…。这里有更多关于 WebLogic 服务器中的过滤器docs.oracle.com/cd/E13222_01/wls/docs81/webapp/filters.html
    猜你喜欢
    • 2016-12-10
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2016-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多