java-Wicket CaptchaImageResource在Linux服务器上创建零长度图像

我正在使用Wicket的CaptchaImageResource保护提交表单免受机器人攻击.在使用Jetty服务器的测试环境(Mac)中,以及在部署到本地Tomcat实例时,它都能正常工作.

但是,当将应用程序部署到远程Linux服务器上的Tomcat 7时,验证码映像无法呈现.相反,我得到一个零字节的响应.这是curl -v返回的图像URL的内容:

HTTP/1.1 200 OK
Date: Thu, 28 Jul 2011 14:28:22 GMT
Set-Cookie: JSESSIONID=6D37183A1FF2C3F43C35B49433A0FC1B; Path=/; HttpOnly
Cache-Control: no-cache, must-revalidate
Content-Type: image/png
Content-Length: 0
Connection: close

* Closing connection #0

我的第一个直觉是Tomcat需要与-Djava.awt.headless = true一起运行.我进行了设置,并通过ps验证了它实际上正在使用该选项运行,但是验证码仍然无法呈现.

我在Tomcat的日志中没有看到任何错误消息或警告.我一直致力于启用远程调试,并在CaptchaImageResource.render()中设置了深断点.它正在输入该方法,但是我再也看不到它的返回.在291行附近的某个地方,它神秘地停止达到我的断点.

服务器JVM是java-1.6.0-openjdk.x86_64.是否有任何原因导致JVM无法以无头模式渲染AWT图形?

解决方法:

啊,biziclop引导我朝着正确的方向前进.我写了这个快速的独立测试(即no-Tomcat):

public static void main(String[] args) throws Exception
{
    CaptchaImageResource resource = new CaptchaImageResource();
    int avail = resource.getResourceStream().getInputStream().available();
    System.out.println("avail: " + avail);
}

导致以下错误:

Probable fatal error:No fonts found.

在该字符串上进行了一些Google搜索,导致我安装了以下软件包:

yum install bitmap*
yum install dejavu-lgc*
yum install bitstream-vera*

现在就可以了.

上一篇:Awt组件基础----键盘监听


下一篇:Java 在Excel中添加水印(单一水印、平铺水印)