Aem 在CQ5.6中进行任何处理之前筛选请求URL

Aem 在CQ5.6中进行任何处理之前筛选请求URL,aem,sling,Aem,Sling,在我的CQ5.6应用程序中,。一旦用户点击一个URL,我就需要使用特定参数对其进行编辑。所有这些都必须在Sling开始处理URL之前发生 我基本上需要转换URL,如下所示: www.mysite.fr-->转换为-->/content/mysite/fr/ 等等 我知道我需要为此创建一个OSGi包,但是我应该使用哪个API来确保URL首先由我的类过滤,然后由 吊带 您可以通过Sling URL映射来实现这一点,而无需过滤器。实现这一点最简单的方法是在/etc/map目录下创建一个节点,其资源类型

在我的CQ5.6应用程序中,。一旦用户点击一个URL,我就需要使用特定参数对其进行编辑。所有这些都必须在Sling开始处理URL之前发生

我基本上需要转换URL,如下所示:
www.mysite.fr
-->转换为-->
/content/mysite/fr/

等等

我知道我需要为此创建一个OSGi包,但是我应该使用哪个API来确保URL首先由我的类过滤,然后由
吊带

您可以通过Sling URL映射来实现这一点,而无需过滤器。实现这一点最简单的方法是在
/etc/map
目录下创建一个节点,其资源类型为
sling:Mapping
&称为
www.mysite.fr

然后获取属性
sling:internalRedirect
——如果传入请求与节点名称匹配,则将此属性附加到路径以继续进行内部资源解析

<map>
    <http jcr:primaryType="sling:OrderedFolder">
        <www.mysite.fr 
            jcr:primaryType="sling:Mapping"
            sling:internalRedirect="/content/mysite/fr"/>
    </http>
</map>

以上内容将确保任何到
www.mysite.fr
的请求都被解析为
www.mysite.fr/content/mysite/fr


您还可以基于regex属性而不是名称进行模式匹配&包括端口号或方案。完整的文档可用。

如果您想为多个网站提供基于代码的解决方案(并且您不想管理/etc/map),您可以设置自己的过滤器:

package your.package;

import org.apache.felix.scr.annotations.*;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.RequestDispatcher;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.sling.commons.osgi.PropertiesUtil;
import org.osgi.service.component.ComponentContext;

@Component(immediate=true, enabled=true)
@Service(value=Filter.class)
@Properties({
    @Property(name="sling.filter.scope", value="REQUEST", propertyPrivate=true),
    @Property(name="service.ranking", intValue=-10000, propertyPrivate=true)
})
public class YourFilter implements Filter {
    private static final Logger log = LoggerFactory.getLogger(ProductSEOFilter.class);

    @Activate
    protected void activate(ComponentContext ctx) throws Exception {
    }

    @Deactivate
    protected void deactivate() throws Exception {
    }

    public void init(FilterConfig filterConfig) throws ServletException {
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    throws java.io.IOException, ServletException {
        String lang = "en";

        // 1. get domain and path
        // 2. check if your conditions are met
        // 3. extract language from domain
        // 4. internal redirect

        RequestDispatcher dispatch = request.getRequestDispatcher("/content/mysite/" + lang);
        dispatch.forward(request, response);
    }

    public void destroy() {
    }
}

您不需要费心检查和传递查询字符串——这些都是在dispatcher中进行的。它只需要一个新的url即可转发。

谢谢您的回复。但是我对/etc/map有一个问题1)它在CQ5.6.1中似乎不起作用,2)该应用程序将被多个网站起诉。所以,我需要一些基于代码的解决方案,它可以被控制并尽可能地隔离。嗨,Riju,你说它在5.6.1中不起作用是什么意思?您是否可以将错误与任何特定内容隔离开来(例如,如果您通过Felix的Sling Resource Resolver选项卡进行测试)?