gpt4 book ai didi

JSF——过滤 javax.faces.resource 文本替换

转载 作者:行者123 更新时间:2023-12-04 22:19:32 25 4
gpt4 key购买 nike

我在 JSF 2.17 Mojarra 上使用 Tomcat7。我想在对/javax.faces.resource/* 的 CSS 和 Javascript 请求之前放置一个 servlet 过滤器,以重写我们的开发和 rc 环境中的某些文本引用。我似乎无法使用传统的 servlet 过滤器更改这些 CSS 和 Javascript 文件。有没有其他方法可以做到这一点?

例如,我希望替换对 CSS 文件中的 url 的引用:prod.ourdomain.com到dev.ourdomain.com

类似的东西。谢谢!

最佳答案

你基本上需要覆盖 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");
}

关于JSF——过滤 javax.faces.resource 文本替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11246718/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com