基本的に、ローカルバッファに書き込む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");
}