转--记一次服务发布之后,图形验证码乱码的服务排查

前端之家收集整理的这篇文章主要介绍了转--记一次服务发布之后,图形验证码乱码的服务排查前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

 

由于业务拓展,新买了台系统为centOS7的服务器,配置完jdk和Nginx之后,将服务发布到服务器上并部署启动,然后刷新页面,神奇的事情就出现了:

@H_502_7@

第一个想到的问题,就是进行本地调试,发现一切正常;于是在生成验证码文本的地方加上了logger输出,再次发布程序到服务器上,确定是否是文本生成时产生的问题,附上代码:@H_502_7@

//@H_502_7@        String vcode = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";@H_502_7@
        String vcode = "@H_502_7@0123456789@H_502_7@"@H_502_7@;
        codeImg @H_502_7@= new BufferedImage(74@H_502_7@,30@H_502_7@,BufferedImage.TYPE_3BYTE_BGR);
        Graphics2D g @H_502_7@= codeImg.createGraphics();
        g.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION,RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        g.setColor(Color.white);
        g.fillRect(@H_502_7@0@H_502_7@,1)">);
        @H_502_7@for@H_502_7@ (int@H_502_7@ i = 0@H_502_7@; i < 100@H_502_7@; i++) {
            @H_502_7@int@H_502_7@ x = (int@H_502_7@) Math.round((Math.random() * 74@H_502_7@));
            @H_502_7@int@H_502_7@ y = ());
            Color color @H_502_7@= new Color((float@H_502_7@) (Math.random() * 0.7@H_502_7@) + 0.3F@H_502_7@,(0.3F@H_502_7@502_7@);
            g.setColor(color);
            g.drawRect(x,y,@H_502_7@1@H_502_7@,1)">1@H_502_7@);
        }
        code @H_502_7@= ""@H_502_7@;
        @H_502_7@4@H_502_7@; i++int@H_502_7@ fontsize = (int@H_502_7@) Math.round(Math.random() * 3@H_502_7@ + 20@H_502_7@);
            Font font @H_502_7@= new Font(""@H_502_7@,1)">3@H_502_7@),fontsize);
            Color color @H_502_7@= new Color((0.7@H_502_7@),1)">0.7@H_502_7@));
            g.setColor(color);
            g.setFont(font);
@H_502_7@            Character c = vcode.charAt(Math.round((float) Math.random() * 35));@H_502_7@
            Character c = vcode.charAt(Math.round((float@H_502_7@) Math.random() * 9@H_502_7@));
            code @H_502_7@+= c;
            g.drawString(c @H_502_7@+ 18@H_502_7@ * i + (int@H_502_7@) (Math.random() * 10@H_502_7@ - 5@H_502_7@) + 2@H_502_7@,1)">24@H_502_7@ + (5@H_502_7@));
        }
        logger.@H_502_7@info@H_502_7@(code:{}@H_502_7@502_7@@H_502_7@

运行服务之后,通过日志,发现文本生成输出正常,开始怀疑是否是jdk版本不一致导致的问题。因为我们开发环境装的是jdk7,服务器上装的是jdk8,难道是jdk做向下兼容的时候出现的问题;于是将项目发到另一台也是jdk8的服务器上,启动测试,发现一切正常,排除jdk版本问题。此时,再次查看代码,发现Graphics2D在生成文本的时候,其实调用了Font组件

@H_502_7@


进入font源码:@H_502_7@

    public Font(String name,int@H_502_7@ style,1)">int@H_502_7@ size) {
        this.name @H_502_7@= (name != null@H_502_7@) ? name : Default@H_502_7@;
        this.style @H_502_7@= (style & ~0x03@H_502_7@) == 0@H_502_7@ ? style : 0@H_502_7@;
        this.size @H_502_7@= size;
        this.pointSize @H_502_7@= size;
    }@H_502_7@@H_502_7@

发现用的是系统的默认字体,windows平台默认是微软雅黑,查看对应服务器上的系统字体:@H_502_7@

@H_502_7@

以及系统的字体列表:@H_502_7@

@H_502_7@

发现并没有我们需要的字体,于是基本可以确定问题点是出在系统字体上面。@H_502_7@

解决方法很直接,就是直接到windows的字体目录下@H_502_7@

@H_502_7@

选择 微软雅黑 字体,直接上传到服务器的字体文件目录下( /usr/share/fonts/),可以创建自定义目录:(我是新建了micro的目录,将拷贝出来的字体放在了此目录下)

@H_502_7@

然后利用命令:fc-cache 重新载入字体配置(该步骤一定得操作否则验证码还是乱码),清除字体缓存。然后重启项目,发现验证码正常。@H_502_7@

由于自己也遇到了类似的问题,遂转载记录下。@H_502_7@

转自:https://blog.csdn.net/zs296332478/article/details/78144460@H_502_7@

猜你在找的Linux相关文章