我在JSF 2.17 Mojarra上使用Tomcat7。我想在CSS和Javascript请求前面放置一个servlet过滤器到/javax.faces.resource/*来重写我们的开发和rc环境中的某些文本引用。我似乎无法使用传统的servlet过滤器更改这些CSS和Javascript文件。还有其他方法可以实现这个目标吗?
例如,我正在寻找替换CSS文件中找到的url的引用: prod.ourdomain.com 至 dev.ourdomain.com
这样的事情。谢谢!答案 0 :(得分: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
然而,这可以进一步优化。您也可以在自定义输出流中执行作业而不是缓冲整个响应,只缓存以<h:outputStylesheet>
开头的字符,然后将其丢弃并写入新字符串,然后继续。
更新:一个完全不同的选择,毕竟实际上更好,就是在CSS文件中直接使用EL。由JSF someSelector {
background: url("http://#{staging.dev ? 'dev' : 'prod'}.ourdomain.com/image.png");
}
执行的CSS资源请求,默认情况下支持CSS文件中的EL。例如,
{{1}}