您基本上需要使用写入本地缓冲区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");
}