2013-08-26 31 views
2

在我的CQ5.6應用程序中。只要用戶點擊一個URL,我需要使用某些參數進行編輯。所有這些都必須在Sling開始處理URL之前進行。在CQ5.6中的任何處理之前過濾請求URL

基本上,我需要的URL轉換,如: www.mysite.fr - >轉換 - >/content/mysite/fr/

等等....

我明白我需要創建一個OSGi包爲此,我應該使用哪個API來確保該URL先由我的課程過濾,然後由 Sling提供服務。 ?

回答

3

,如果你想在多個網站基於代碼的解決方案(和你不想管理的/ 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轉發到。

3

您可以通過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

+0

感謝您的回覆。但是我對/ etc/map有個問題1)它在CQ5.6.1中似乎不起作用,2)應用程序將被多個網站起訴。所以,我需要一些基於代碼的解決方案,可以控制並儘可能地隔離。 –

+0

嗨Riju,你的意思是它似乎在5.6.1中不起作用?您能否將錯誤隔離爲特定的任何內容(例如,如果您通過Felix的Sling Resource Resolver標籤進行測試)? – anotherdave

相關問題