2012-02-04 50 views
0

我想將lng參數添加到所有鏈接。我怎樣才能不用將缺省參數添加到<h:outputLink>,<h:commandLink>等

<f:param name="lng" .... 

在每個鏈接? lng的值在會話範圍的bean中。

也許Filter可以做到這一點,但在這種情況下,我怎麼才能訪問沒有注入的價值?

+0

爲什麼你需要這個,如果它已經在會話scoped bean中了?這是純粹的SEO目的嗎? – BalusC 2012-02-04 20:59:48

+0

確切地說,SEO目的,我們的SEO部門需要在頁面上的每個鏈接都有'lng'。 – TinGinard 2012-02-05 08:17:12

回答

0

所以只是看着URLRewrite過濾器我找到了解決方案。

我編寫了一個覆蓋響應的過濾器和encodeURL方法。

doFilter方法,檢測是否有對請求LNG PARAM,如果不是從bean獲得的getDefaultLng方法默認LNG值:

public void doFilter(ServletRequest request, ServletResponse response, 
     FilterChain chain) throws IOException, ServletException { 
    final HttpServletRequest hsRequest = (HttpServletRequest) request; 
    final HttpServletResponse hsResponse = (HttpServletResponse) response; 
    if (hsRequest.getParameter("lng")!=null){ 
     lng = hsRequest.getParameter("lng"); 
    } else { 
     lng = getDefaultlng(hsRequest, hsResponse); 
    } 
    LngResponse lngResponse = new LngResponse(hsResponse,lng); 
    chain.doFilter(hsRequest, lngResponse); 
} 

一個的LngResponse#encodeURL,只是增加了PARAM。

public String encodeURL(String s) { 
    s = parseUrl(s); 
    return super.encodeURL(s); 
} 

private String parseUrl(String s){ 
    if (s.indexOf("lng=")==-1){ 
     if (s.indexOf("?")>-1){ 
      s = s+"&lng="+this.lng; 
     } else { 
      s = s+"?lng="+this.lng; 
     } 
    } 
    return s; 
} 

最後它的工作,所以我們的SEO部門有他們獨特的URI。