2008-10-08 26 views
1

我正在向OC4J部署JSF(myfaces,restfaces和richfaces)應用程序。我不希望jsessionid出現在狀態欄或URL地址中。幾乎在所有情況下我都設法壓制它。我仍遇到問題的一種情況是,首次使用「乾淨」瀏覽器訪問網站時(無緩存,歷史記錄等)。在這種情況下,jsessionid會出現在每個鏈接上,直到任何鏈接被點擊,然後它會消失,並且不會再回來(即使在後續會話中),直到瀏覽器的緩存被再次清除。jsessionID如何在OC4J上被抑制?

在別人看來遇到了這個問題,但我沒有發現任何決議或變通:

回答

2

在Servlet過濾器下面的代碼有爲我們工作。這個想法是通過使用自定義響應包裝來覆蓋任何URL重寫邏輯。

public void doFilter( 
    ServletRequest req, 
    ServletResponse resp, 
    FilterChain filterChain) 
    throws IOException, ServletException 
{ 
    if (req instanceof HttpServletRequest && 
     resp instanceof HttpServletResponse) 
    { 
     doFilter( 
      (HttpServletRequest) req, 
      (HttpServletResponse) resp, 
      filterChain); 
    } 
    else 
    { 
     filterChain.doFilter(req, resp); 
    } 
} 

private void doFilter( 
    HttpServletRequest request, 
    HttpServletResponse response, 
    FilterChain filterChain) 
    throws IOException, ServletException 
{ 
    RequestHandler requestHandler = getRequestHandler(request); 

    HttpServletResponse wrappedResponse = getWrappedResponse(response); 

    filterChain.doFilter(request, wrappedResponse); 
} 

private HttpServletResponse getWrappedResponse( 
    HttpServletResponse response) 
{ 
    return 
     new HttpServletResponseWrapper(response) 
     { 
      public String encodeRedirectUrl(String url) { return url; } 

      public String encodeRedirectURL(String url) { return url; } 

      public String encodeUrl(String url) { return url; } 

      public String encodeURL(String url) { return url; } 
     }; 
}