在我的CQ5.6应用程序中。一旦用户点击URL,我需要使用某些参数对其进行编辑。所有这一切必须在Sling开始处理URL之前发生。
我基本上需要将URL转换为:
www.mysite.fr
- >转换为 - > /content/mysite/fr/
依旧......
我知道我需要为此创建一个OSGi包,但是我应该使用哪个API来确保首先由我的类过滤URL,然后通过 吊带。 ?
答案 0 :(得分:3)
您可以通过吊索网址映射执行此操作,而无需过滤器。实现此目的的最简单方法是在/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
。
您还可以根据正则表达式属性而不是名称&amp;来模式匹配。包括端口号或方案。完整文档可用on the Sling website。
答案 1 :(得分:3)
如果你想为多个网站提供基于代码的解决方案(并且你不想管理/ 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() {
}
}
你不需要费心检查和传递查询字符串 - 这些是在调度员中进行的。它只需要一个新的网址转发。