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

标签 java tomcat wicket awt headless

我正在使用 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 无法在 headless (headless)模式下呈现 AWT 图形有什么原因吗?

最佳答案

啊,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*

现在可以了。

关于java - Wicket CaptchaImageResource 在 Linux 服务器上创建零长度图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6861009/

相关文章:

部署 Tomcat6 JSF 应用程序时出现解析错误 - digester.Digester

java - 网格上的纹理不渲染,只显示黑色 libgdx gl20

Java 版本在 Linux 上没有变化

java - "multi plugins"Java Web 应用程序的最佳实践 - 管理公共(public)库和冲突版本

java - 是否可以更改 Wicket Activity 指示器的颜色?

java - 如何在 Spring Boot wicket 应用程序中注入(inject) RequestScope bean

java - 在 Wicket 中使用可添加书签的页面的 Tomcat 错误页面

java - Java 字符串中字母的移位

java - 未安装 JDK 1.8,仅在 Windows 上安装 JRE

jsf - 在 Jsf 2 中使用 servlet 3.0 登录的用户身份验证不起作用