【问题标题】:Wicket CaptchaImageResource creating zero-length images on Linux serverWicket CaptchaImageResource 在 Linux 服务器上创建零长度图像
【发布时间】:2011-07-28 14:52:20
【问题描述】:

我正在使用 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 图形有什么原因吗?

【问题讨论】:

  • 您要部署哪种风格的 linux?我在 Centos 上使用 JFreeChart 呈现类似的问题(也使用 tomcat 容器)。
  • @ireddick - 我也一样 - 它是 Rackspace 中的 Centos 服务器。
  • 您是否在同一台机器上尝试过独立测试?或者,在不同的操作系统上进行 Tomcat 测试。

标签: java tomcat wicket awt headless


【解决方案1】:

啊,biziclop 引导我朝着正确的方向前进。我编写了这个快速的独立(即无 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.

对该字符串的一些谷歌搜索导致我安装了以下软件包:

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

现在它可以工作了。

【讨论】:

  • 不错的一个。我敢打赌,有一天它也会对我派上用场。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多