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

时间:2018-04-12 19:50:35

标签: redirect aem cq5

我正在尝试为页面重定向创建自定义组件。用例是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");
    }
}

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

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

2 个答案:

答案 0 :(得分:3)

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

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

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

重要提示:

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

答案 1 :(得分:0)

当需要按照某种模式处理多个页面并且您想事先进行一些处理时,使用吊带过滤器。

如果您已经知道页面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中的正则表达式以适应您的需求。