JFinal

登录 注册

CaptchaRender在Linux下字体存在问题

之前部署一个项目,在腾讯云主机上,是Ubuntu+OpenJDK1.9。项目在Windows下没问题,一部署到Linux上JVM就崩溃。后来根据日志跟踪到是CaptchaRender这个类中的问题。

protected void drawGraphic(String randomString, BufferedImage image){
    ...
    
    g.setFont(RANDOM_FONT[random.nextInt(RANDOM_FONT.length)]);
    ...
}

这段代码随机使用了一个字体数组,定义如下

protected static final Font[] RANDOM_FONT = new Font[] {
   new Font("nyala", Font.BOLD, 38),
   new Font("Arial", Font.BOLD, 32),
   new Font("Bell MT", Font.BOLD, 32),
   new Font("Credit valley", Font.BOLD, 34),
   new Font("Impact", Font.BOLD, 32),
   new Font(Font.MONOSPACED, Font.BOLD, 40)
};

其中有字体在Linux下不存在。所以会有问题。我临时解决的办法是修改了CaptchaRender类,重新定义了一个MyCatchaRender类,添加数组

protected static final Font[] RANDOM_FONT_LINUX = new Font[]{
        new Font(Font.MONOSPACED, Font.BOLD, 32),
        new Font(Font.SANS_SERIF, Font.BOLD, 32),
        new Font(Font.SERIF, Font.BOLD, 32)
};

然后在drawGraphic方法中判断操作系统类型,如果是Windows则使用RANDOM_FONT数组,否则使用RANDOM_FONT_LINUX数组。

覆盖drawGraphic方法

protected void drawGraphic(String randomString, BufferedImage image){
    ...
    //设定字体
    if(StrUtil.containsAnyIgnoreCase(System.getProperty("os.name"),"windows")) {
        g.setFont(RANDOM_FONT[random.nextInt(RANDOM_FONT.length)]);
    }else{
        g.setFont(RANDOM_FONT[random.nextInt(RANDOM_FONT_LINUX.length)]);
    }...
}

上面用了hutool库。不知道其他人有没有这个问题。

评论

  • 04-16 17:24
    有些 linux 版本缺少一些字体,所以会有乱码,解决办法看这里:
    http://www.jfinal.com/share/411

    此外,jfinal 3.4 已改进了这里,采用了更为通用的字体,jfinal 3.4 还差几天发布,你可以通过这个贴子的办法先用上:
    http://www.jfinal.com/share/714
  • 04-16 17:26
    还有一个更简单的办法是拿到新版本的 CaptchaRender.java 代码改名为 MyCaptchaRender.java,用的时候这样:
    rendder(new MyCaptchaRender());

    最新代码在这里:
    https://gitee.com/jfinal/jfinal/tree/master/src/main/java/com/jfinal/captcha
  • 发送