7
回答
jfinal在openjdk下验证码生成有问题
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

跑在BAE上面,BAE用的openjdk1.6,产生验证码的时候报错:

java.lang.Error: Probable fatal error:No fonts found.
at sun.font.FontManager.getDefaultPhysicalFont(FontManager.java:1087)
at sun.font.FontManager.initialiseDeferredFont(FontManager.java:966)
at sun.font.CompositeFont.doDeferredInitialisation(CompositeFont.java:254)
at sun.font.CompositeFont.getSlotFont(CompositeFont.java:334)
at sun.font.CompositeGlyphMapper.initMapper(CompositeGlyphMapper.java:81)
at sun.font.CompositeGlyphMapper.<init>(CompositeGlyphMapper.java:62)
at sun.font.CompositeFont.getMapper(CompositeFont.java:390)
at sun.font.GlyphList.mapChars(GlyphList.java:269)
at sun.font.GlyphList.setFromString(GlyphList.java:244)
at sun.java2d.pipe.GlyphListPipe.drawString(GlyphListPipe.java:71)
at sun.java2d.SunGraphics2D.drawString(SunGraphics2D.java:2813)
at utils.MyCapthaRender.drawGraphic(MyCapthaRender.java:88)
at utils.MyCapthaRender.render(MyCapthaRender.java:35)
at com.jfinal.core.ActionHandler.handle(ActionHandler.java:92)
at com.jfinal.core.JFinalFilter.doFilter(JFinalFilter.java:72)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1372)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:487)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:119)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:480)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:249)
at com.baidu.jetty.security.quotalimit.LimitQuotaHandler.doHandle(LimitQuotaHandler.java:64)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1003)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:417)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:200)
at com.baidu.jetty.security.quotalimit.LimitQuotaHandler.doScope(LimitQuotaHandler.java:43)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:934)
at org.eclipse.jetty.webapp.WebAppContext.doScope(WebAppContext.java:539)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117)
at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:226)
at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:149)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:110)
at org.eclipse.jetty.rewrite.handler.RewriteHandler.handle(RewriteHandler.java:305)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:110)
at org.eclipse.jetty.server.Server.handle(Server.java:368)
at org.eclipse.jetty.server.HttpConnection.handleRequest(HttpConnection.java:605)
at org.eclipse.jetty.server.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:1069)
at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:601)
at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:214)
at org.eclipse.jetty.server.HttpConnection.handle(HttpConnection.java:425)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:535)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:40)
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:529)
at java.lang.Thread.run(Thread.java:679)

找不到解决办法....


@jfinal

举报
kidbei
发帖于5年前 7回/1K+阅
共有7个答案 最后回答: 1年前
好吧,终于看到百度的回复了: 您好,这个是开源JDK6的一个bug,为了修复这个BUG,我们近期会上线image服务的添加水印的功能,就可以满足您的这个需求,还请您耐心等待。

No fonts found..很简单的错误

验证码上面的字符是画出来的,需要指定字体,如果是英文和数字的话,可以使用默认字体,如果是中文的话,必须指定一种中文字体。如果连默认字体都找不到,就是系统问题,和你代码无关。

推测是你用了自定义的字体,服务器上当然没有了

--- 共有 2 条评论 ---
kidbei这是跑在BAE上的,BAE用的是openjdk,头疼 5年前 回复
kidbei我将setFont()那一句注释掉了,照样报这个错误 5年前 回复
URL url = new URL(baseUrl + "msyh.ttc");
InputStream is = url.openStream();
cFont = Font.createFont(Font.PLAIN, is);
System.out.println("cFont--"+cFont);

is.close();

Graphics2D g = bi.createGraphics();
g.setColor(color);
try {
if (fontName == null) {
g.setFont(font.deriveFont(fontStyle, fontSize));
} else {
g.setFont(new Font(fontName, fontStyle, fontSize));
}
} catch (Exception e) {
e.printStackTrace();
}
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
alpha));


g.drawString(charSequ, x, y + fontSize);


g.dispose();
return bi;

但是画出来数字离的太开了。

@JFinal 最近用dokcer部署了一个tomcat,然后tomcat官方的docker镜像貌似都是用openjdk的。然后验证码那边也是类似的问题。不知道是否已经有解决方案?

--- 共有 2 条评论 ---
听_风回复 @JFinal : 感谢波总~回复总是那么及时。 1年前 回复
JFinal自创一个 MyCaptchRender extends CaptchRender,然后改改里面的字体配置,改成一个你的系统支持的字体,然后 render(new MyCaptchRender()); 这样使用 1年前 回复
顶部