3

私はJSF2.17MojarraでTomcat7を使用しています。/javax.faces.resource/*へのCSSおよびJavascriptリクエストの前にサーブレットフィルターを配置して、開発環境とrc環境で特定のテキスト参照を書き換えたいと思います。従来のサーブレットフィルタを使用してこれらのCSSファイルとJavascriptファイルを変更することはできないようです。これを達成する他の方法はありますか?

たとえば、CSSファイル内にあるURLへの参照をprod.ourdomain.comからdev.ourdomain.comに置き換えたいと考えています。

そんな感じ。ありがとう!

4

1 に答える 1

3

基本的に、ローカルバッファに書き込むHttpServletResponse#getOutputStream()カスタムでオーバーライドし、そこで文字列を置き換えて、最後に変更された文字列を応答に書き込む必要があります。ServletOutputStreamこれはかなりのコードなので、さらに役立つクラスがいくつかあります。

次に、基本的に次のようにフィルターを実装できます。

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
    if (((HttpServletRequest) request).getRequestURI().endsWith(".css.xhtml")) { // If you use *.xhtml as JSF mapping.
        BufferedHttpServletResponse bufferedResponse = new BufferedHttpServletResponse(((HttpServletResponse) response);
        chain.doFilter(request, bufferedResponse);
        String string = new String(bufferedResponse.getBuffer(), response.getCharacterEncoding());
        string = string.replace("http://prod.ourdomain.com", "http://dev.ourdomain.com");
        response.getWriter().write(string);
    }
    else {
        chain.doFilter(request, response);
    }
}

ただし、これはさらに最適化するために開かれています。応答全体をバッファリングする代わりに、カスタム出力ストリーム内でジョブを実行し、で始まる文字のみをバッファリングしてhttp://prod.ourdomain.comから、それを破棄し、代わりに新しい文字列を書き込んでから続行することもできます。


更新:まったく異なる代替手段は、結局のところ、実際には、CSSファイルでELを直接使用することです。JSFによって実行されるCSSリソース要求、<h:outputStylesheet>つまりデフォルトでは、CSSファイルでELをサポートします。例えば、

someSelector {
    background: url("http://#{staging.dev ? 'dev' : 'prod'}.ourdomain.com/image.png");
}
于 2012-06-28T15:02:22.730 に答える