3

Wicket のCaptchaImageResourceを使用して、送信フォームをボットから保護しています。Jetty サーバーを使用するテスト環境 (Mac) で正常に動作し、ローカルの Tomcat インスタンスにデプロイした場合も同様です。

しかし、アプリがリモート Linux サーバー上の Tomcat 7 にデプロイされると、Captcha 画像のレンダリングに失敗します。代わりに、0 バイトの応答が返されます。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 のログにエラー メッセージや警告が表示されません。リモート デバッグを有効にし、ブレークポイントを .NET の奥深くに設定するところまで行きましたCaptchaImageResource.render()。そのメソッドに入っていますが、戻ってくることはありません。291行目のどこかで、不思議なことにブレークポイントにヒットしなくなります。

サーバー JVM はjava-1.6.0-openjdk.x86_64. その JVM がヘッドレス モードで AWT グラフィックスをレンダリングできない理由はありますか?

4

1 に答える 1

4

ああ、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*

そして今、それは機能します。

于 2011-07-29T04:12:06.037 に答える