【发布时间】:2015-01-16 13:37:20
【问题描述】:
我们使用 CRX DE lite/Adobe EM 作为 Angularjs SPA UI/前端的后端。我们如何为这种后端技术设置 CORS?我们可以访问工具http://localhost:4502/crx/de/index.jsp 来更改设置。但我们不确定如何启用 CORS。
请指教。
【问题讨论】:
我们使用 CRX DE lite/Adobe EM 作为 Angularjs SPA UI/前端的后端。我们如何为这种后端技术设置 CORS?我们可以访问工具http://localhost:4502/crx/de/index.jsp 来更改设置。但我们不确定如何启用 CORS。
请指教。
【问题讨论】:
我不知道在 AEM 中的何处启用 CORS(或者如果可能的话,我会查看 OSGi 控制台 http://localhost:4502/system/console/configMgr 如果有的话),但解决 CORS 问题的一种方法是公开 AEM 和在同一个域中的前端,通过在 Apache 上设置代理应该相当容易。
在您的 AEM 发布实例前面的 Apache 服务器上,在 httpd.conf 中,您可以执行以下操作:
ProxyPass /your-frontend http://whatever.it.runs.on/actual-path-to-the-frontend/
ProxyPassReverse /your-frontend http://whatever.it.runs.on/actual-path-to-the-frontend/
【讨论】:
从 AEM 6.3 开始
有一个名为Adobe Granite Cross-Origin Resource Sharing Policy 的OOTB 服务。就像使用 alloworigin=[http://localhost:8000] 属性创建 OSGi 配置一样简单。就我而言,我的 Angular 应用程序在端口 8000 上运行,试图访问 4503 上的发布者。
AEM 6.3 之前的版本
我最终要做的(起初)是创建一个实现AuthenticationInfoPostProcessor 的服务。在那里,我设置了以下标题:
GET 请求一切正常。但是当我们尝试 POST 时,我们遇到了浏览器发送飞行前 OPTIONS 请求失败的问题,因为浏览器没有使用login-token cookie。
然后我们尝试了@SlingFiter,但是它属于正常的 sling 管道,因此它是在检查身份验证之后,所以没有 auth cookie,预飞行总是会失败。
最后,我们实现了一个带有以下注解的过滤器:
@Component(immediate = true)
@Service(value = Filter.class)
@Properties({ @Property(name = "pattern",
value = "/.*"),
@Property(name = Constants.SERVICE_RANKING,
intValue = 1000) })
这里的关键是 pattern 属性,它将过滤器注册为 Apache Felix Whiteboard 过滤器,而不是 Sling。 See here。因此过滤器将为 OPTIONS 设置 CORS 头并返回,并为其他所有内容设置 CORS 头,并将请求传递给链中的下一个过滤器。
【讨论】: