【问题标题】:AEM Custom component for page redirect用于页面重定向的 AEM 自定义组件
【发布时间】:2018-10-15 14:48:20
【问题描述】:

我正在尝试为页面重定向创建自定义组件。用例是 pageB 应该只能通过 pageA 访问。如果直接访问 pageB,则应将用户重定向到 pageA。 为了实现这一点,我在 pageA 的请求范围内设置了一个变量。在 pageB 中,我将包含一个组件(可拖放),它将查找 pageA 的请求范围变量,如果它不可用,那么我们的 pageB 将被重定向,使用下面的 sn-p。

private void redirect(SlingHttpServletRequest request) {
    String redirectPath = "/content/geometrixx/home.html";        
    if (StringUtils.isNotBlank(redirectPath)) {           
        getResponse().setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
        getResponse().setHeader(redirectPath);
    } else {
        LOGGER.error("Redirect path is not set in component");
    }
}

但是上面的代码失败了。我相信这是由于“响应已经提交”错误。

有人可以建议我解决这个问题吗?

【问题讨论】:

    标签: redirect aem


    【解决方案1】:

    我建议您不要在页面上使用组件来执行此操作。还有另一种称为(Sling) Filter 的机制更适合这样的事情。

    简单地说,过滤器是一个 OSGi 服务,在每个请求上都会被调用。过滤器获取传递的请求和响应,并可以使用它们来做不同的事情,例如检查用户是否在访问另一个页面之前访问了一个页面。

    在 StackOverflow 上已经有一个很好的答案:Filter request URL before any processing in CQ5.6

    重要提示:

    过滤器仅在用户请求到达 AEM 时运行。典型的 AEM 安装使用缓存响应的所谓 Dispatcher(具有特殊“Dispatcher”Apache 模块的 Apache)。如果响应被缓存,Dispatcher 将提供缓存的 HTML 页面,而不是请求 AEM。因此,如果从 Dispatcher 缓存提供页面,您的过滤器将不会运行,因此无法完成此检查。有几种方法可以解决这个问题,但这是另一个问题的主题。

    【讨论】:

    • 嘿 Jens,这不是说过滤器解决方案不太适合这种情况,因为标准 AEM 架构需要缓存层?从我的角度来看,这听起来像是在 <head/> 部分或调度程序中用 JavaScript 实现的重定向,如果在这种边缘情况下应该触摸它的话。向德累斯顿问好!
    • 这在很大程度上取决于您的项目和要求。如果您有一个低频站点,您可以完全不缓存这些页面。如果您需要调度程序,那么您对大多数其他解决方案也很不走运。如果您使用页面组件,您将遇到同样的问题,但在应用程序的另一部分。如果您必须进行缓存,最好通过 cookie/重写规则等在 Dispatcher 中实现这一点。
    【解决方案2】:

    当需要按照某种模式处理多个页面并且您希望预先进行一些处理时,使用 Sling 过滤器。

    如果您已经知道页面 URL 并且只是想要重定向,那么您还可以使用 sling:Mapping 将页面 B 请求重定向到页面 A。

    你可以使用这样的东西。

    转到 /etc/map/http 并在此路径下创建一个节点。对于 https 请求,也为 https 创建一个 sling:folder。

    /etc/map
          +-- http
          |    +-- jcr:primaryType="sling:Folder"
               +-- page-b
               |    +-- jcr:primaryType="sling:Mapping"  
               |    +-- sling:redirect=/content/pageA.html -> Type String
               |    +-- sling:match=localhost.4502/content/pageB(.*)(/.*) -> Type String
          +-- https
          |    +-- jcr:primaryType="sling:Folder"
               +-- page-b
               |    +-- jcr:primaryType="sling:Mapping"  
               |    +-- sling:redirect=/content/pageA.html -> Type String
               |    +-- sling:match=localhost.4502/content/pageB(.*)(/.*) -> Type String
    

    或者,如果您只是想对资源进行内部处理并避免页面重新加载,您可以使用:

    jcr:primaryType="sling:Mapping"  
    sling:internalRedirect=/content/pageA.html -> Type String
    sling:match=localhost.4502/content/pageB(.*)(/.*) -> Type String 
    

    处理调度程序重定向:

    在调度程序中包含一个重写规则,用于从 pageB 重定向到 pageA。

    注意:您可以更改 sling:match 中的正则表达式以满足您的需要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-01
      • 1970-01-01
      • 2019-09-14
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      相关资源
      最近更新 更多