记切换openjdk后验证码问题

背景

通常使用得是oracle jdk,但是有的需要使用open jdk,但是如果使用了字体相关得操作,如验证码就会出现找不到字体得问题。
验证码无法显示,后台代码抛出异常,异常内容如下,java.lang.NullPointerException at sun.awt.FontConfiguration.getVersion(FontConfiguration.java 1264)

区别

  1. 授权协议的不同:
    openjdk采用GPL V2协议放出,而JDK则采用JRL放出。
    两者协议虽然都是开放源代码的,但是在使用上的不同在于GPL V2允许在商业上使用,而JRL只允许个人研究使用。
  2. OpenJDK不包含Deployment(部署)功能:
    部署的功能包括:Browser Plugin、Java Web Start、以及Java控制面板,这些功能在Openjdk中是找不到的。
  3. OpenJDK源代码不完整:
    在采用GPL协议的Openjdk中,sun jdk的一部分源代码因为产权的问题无法开放openjdk使用,其中最主要的部份就是JMX中的可选元件SNMP部份的代码。因此这些不能开放的源代码将它作成plug,以供OpenJDK编译时使用,你也可以选择不要使用plug。而Icedtea则为这些不完整的部分开发了相同功能的源代码(OpenJDK6),促使OpenJDK更加完整。
  4. 部分源代码用开源代码替换:
    由于产权的问题,很多产权不是SUN的源代码被替换成一些功能相同的开源代码,比如说字体栅格化引擎,使用Free Type代替。
  5. openjdk只包含最精简的JDK:
    OpenJDK不包含其他的软件包,比如Rhino Java DB JAXP……,并且可以分离的软件包也都是尽量的分离,但是这大多数都是自由软件,你可以自己下载加入。

解决字体问题

服务器可以联网

yum install fontconfig
fc-cache --force

不能联网(在代码中加载字体)

  1. 在项目得resource中添加一个fonts文件夹
  2. 找一个可以使用得字体,windows系统:打开C:\Windows\Fonts 目录,找个喜欢的字体,复制到项目里
  3. 代码
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.core.io.ClassPathResource;
 
import java.awt.*;
import java.io.InputStream;
 

public class FontUtils{
 
    private static Font loadFontResource() throws Exception {
        InputStream resourceAsStream = null;
        try {
            ClassPathResource classPathResource = new ClassPathResource("fonts/STXIHEI.TTF");
            resourceAsStream =classPathResource.getInputStream();
            Font font = Font.createFont(Font.TRUETYPE_FONT, resourceAsStream);
            Font targetFont = font.deriveFont(Font.PLAIN);
            return targetFont;
        } catch (FontFormatException e) {
            e.printStackTrace();
            return null;
        }
 
    }
}

注意:"fonts/STXIHEI.TTF"相对路径如果获取不到,可以使用绝对路径

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值