我们使用 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。见这里。因此过滤器将为 OPTIONS 设置 CORS 标头并返回,并为其他所有内容设置 CORS 标头,并将请求传递给链中的下一个过滤器。