Redirect 用于页面重定向的AEM自定义组件

Redirect 用于页面重定向的AEM自定义组件,redirect,aem,Redirect,Aem,我正在尝试为页面重定向创建自定义组件。用例是pageB,应该只能通过pageA访问。如果直接访问pageB,则应将用户重定向到pageA。 为了实现这一点,我在pageA的请求范围中设置了一个变量。在pageB中,我将包含一个组件(拖放),它将查找pageA的请求范围变量,如果它不可用,我们将使用下面的代码段重定向pageB private void redirect(SlingHttpServletRequest request) { String redirectPath = "/c

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

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");
    }
}
但是上面的代码失败了。我相信这是由于“回应已经提交”的错误

有人能给我一个解决这个问题的方法吗?

我建议您不要使用页面上的组件来解决这个问题。还有另一种机制叫做,它更适合这种情况

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

StackOverflow上已经有了这样一个很好的答案:

重要提示:

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

我建议您不要使用页面上的组件来解决这个问题。还有另一种机制叫做,它更适合这种情况

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

StackOverflow上已经有了这样一个很好的答案:

重要提示:


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

当需要按照特定模式处理多个页面,并且您希望事先进行一些处理时,可以使用Sling filter

如果您已经知道页面URL,只需要重定向,那么您也可以使用sling:Mapping将页面B请求重定向到页面a

你可以用这样的东西

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

/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 
要处理调度程序重定向,请执行以下操作:

在dispatcher中包含重写规则,以便从pageB重定向到pageA


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

如果需要按照特定模式处理多个页面,并且您希望事先进行一些处理,则使用sling筛选器

如果您已经知道页面URL,只需要重定向,那么您也可以使用sling:Mapping将页面B请求重定向到页面a

你可以用这样的东西

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

/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 
要处理调度程序重定向,请执行以下操作:

在dispatcher中包含重写规则,以便从pageB重定向到pageA


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

嘿,Jens,这是否意味着过滤器解决方案不适合这种情况,因为标准AEM体系结构需要缓存层?在我看来,这听起来像是JavaScript在
部分或dispatcher上实现的重定向,如果应该针对这种边缘情况使用它的话。欢迎来到德累斯顿!这在很大程度上取决于您的项目和需求。如果你有一个低频率的网站,你可以不缓存这些网页。如果您需要dispatcher,您也可以使用其他大多数解决方案。如果您使用页面组件,您将遇到相同的问题,但在应用程序的另一部分。如果必须使用缓存,那么最好通过cookies/重写规则等在调度程序中实现。嘿,Jens,这难道不意味着过滤器解决方案不适合这种情况,因为标准AEM体系结构需要缓存层吗?在我看来,这听起来像是JavaScript在
部分或dispatcher上实现的重定向,如果应该针对这种边缘情况使用它的话。欢迎来到德累斯顿!这在很大程度上取决于您的项目和需求。如果你有一个低频率的网站,你可以不缓存这些网页。如果您需要dispatcher,您也可以使用其他大多数解决方案。如果您使用页面组件,您将遇到相同的问题,但在应用程序的另一部分。如果必须进行缓存,最好通过cookie/重写规则等在调度程序中实现。