我有一个.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>
这是否足够且安全?
答案 0 :(得分:2)
return new String(b);
这样,您依赖于服务器计算机默认字符编码,这可能不是正确的字符编码本身。假设byte[]
包含UTF-8字节,服务器机器配置为使用ISO-8859-1作为默认编码,则new String(b)
可能返回mojibake。您想明确指定字符编码。
return new String(b, "UTF-8");
关于这种方法,我建议使用一个servlet,它返回一个完整的.css
文件,然后将样式raw放在<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方式。