gpt4 book ai didi

java - JSF : CSS file as byte[] to String

转载 作者:行者123 更新时间:2023-11-30 05:07:14 24 4
gpt4 key购买 nike

我有一个 .css 文件,将 id DB 保存为 byte[]。现在我需要将该文件的内容包含在页面正文中。我这样做是这样的:

class FlowUtils {
private Integer themeId;
private ThemeDAO themeDAO;

public String getThemeCss() {
byte[] b = themeDAO.get(themeId).getCss();
return new String(b);
}
}

<h:head>
<style type="text/css">
#{flowUtils.themeCss}
</style>
</h:head>

这种方式足够且安全吗?

最佳答案

return new String(b);

这样您就依赖于服务器计算机的默认字符编码,该编码本身可能不是正确的字符编码。想象一下byte[]包含 UTF-8 字节并且服务器计算机配置为使用 ISO-8859-1 作为默认编码,则 new String(b)可能会返回mojibake 。您想明确指定字符编码。

return new String(b, "UTF-8");

至于该方法,我建议使用返回完整值的 servlet .css上面的文件将原始样式放入 <style> 。这样,您最终会得到一个较小的页面(以字节为单位),并且您可以控制返回的 CSS 文件的缓存,这样您就不必在每个请求时都返回它。这最终在网络带宽消耗和服务器 CPU/内存资源方面更加高效。

<link rel="stylesheet" href="cssservlet?id=123" />

其中文件 servlet 执行如下操作:

byte[] bytes = themeDAO.get(request.getParameter("id"));
response.setContentType("text/css;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
response.setDateHeader("Expires", System.currentTimeMillis() + 604800000L); // Cache for one week.
response.getOutputStream().write(bytes);

为了进一步改进它,让它返回 InputStream而不是byte[]这样内存效率会更高一些(byte[] 完全保存在内存中,而 InputStream 只是一个指针)。然后写入OutputStream通常的 Java IO 方式,带有一点字节缓冲区。

另请参阅:

关于java - JSF : CSS file as byte[] to String,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4669338/

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