1

我正在向 OC4J 部署一个 JSF(myfaces、restfaces 和 richfaces)应用程序。我不希望 jsessionid 出现在状态栏或 URL 地址中。我几乎在所有情况下都设法压制它。我仍然遇到问题的一种情况是,首次使用“干净”浏览器(没有缓存、历史记录等)访问该站点时。在这种情况下, jsessionid 出现在每个链接上,直到单击任何链接,然后它消失,并且在浏览器的缓存再次清除之前不会回来(即使在后续会话中)。

似乎其他人遇到了这个问题,但我没有找到任何解决方案或解决方法:

4

1 回答 1

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; }
        };
}
于 2009-04-12T00:03:30.903 回答