我正在尝试为页面重定向创建自定义组件。用例是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");
}
}
但上面的代码失败了。我认为这是由于“响应已经提交”错误。
有人可以建议我解决这个问题吗?
答案 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中的正则表达式以适应您的需求。