我正在使用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*
现在就可以了.