在我的CQ5.6應用程序中。只要用戶點擊一個URL,我需要使用某些參數進行編輯。所有這些都必須在Sling開始處理URL之前進行。在CQ5.6中的任何處理之前過濾請求URL
基本上,我需要的URL轉換,如: www.mysite.fr
- >轉換 - >/content/mysite/fr/
等等....
我明白我需要創建一個OSGi包爲此,我應該使用哪個API來確保該URL先由我的課程過濾,然後由 Sling提供服務。 ?
在我的CQ5.6應用程序中。只要用戶點擊一個URL,我需要使用某些參數進行編輯。所有這些都必須在Sling開始處理URL之前進行。在CQ5.6中的任何處理之前過濾請求URL
基本上,我需要的URL轉換,如: www.mysite.fr
- >轉換 - >/content/mysite/fr/
等等....
我明白我需要創建一個OSGi包爲此,我應該使用哪個API來確保該URL先由我的課程過濾,然後由 Sling提供服務。 ?
,如果你想在多個網站基於代碼的解決方案(和你不想管理的/ etc /圖)你可以設置自己的過濾器:
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() {
}
}
你不必費心檢查並傳遞querystrings - 這些都在調度程序中進行。它只需要一個新的url轉發到。
您可以通過Sling URL Mapping來做到這一點,而不需要過濾器。實現此目的的最簡單方法是在/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
。
您也可以基於正則表達式屬性進行模式匹配,而不是名稱&也包括端口號或方案。完整的文檔可用on the Sling website。
感謝您的回覆。但是我對/ etc/map有個問題1)它在CQ5.6.1中似乎不起作用,2)應用程序將被多個網站起訴。所以,我需要一些基於代碼的解決方案,可以控制並儘可能地隔離。 –
嗨Riju,你的意思是它似乎在5.6.1中不起作用?您能否將錯誤隔離爲特定的任何內容(例如,如果您通過Felix的Sling Resource Resolver標籤進行測試)? – anotherdave