系統在服務器上發佈之後,圖形驗證碼亂碼的問題

應用系統在linux服務器上部署啓動,然後刷新頁面,驗證碼圖形出現亂碼:https://img-blog.csdn.net/20170930174026028?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvenMyOTYzMzI0Nzg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

附上代碼:

// 設置頁面不緩存
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
// response.setContentType("image/png");

// 在內存中創建圖象
final BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
// 獲取圖形上下文
final Graphics2D graphics = (Graphics2D) image.getGraphics();

// 設定背景顏色
graphics.setColor(Color.WHITE); // ---1
graphics.fillRect(0, 0, width, height);
// 設定邊框顏色
//		graphics.setColor(getRandColor(100, 200)); // ---2
graphics.drawRect(0, 0, width - 1, height - 1);

final Random random = new Random();
// 隨機產生干擾線,使圖象中的認證碼不易被其它程序探測到
for (int i = 0; i < count; i++) {
	graphics.setColor(getRandColor(150, 200)); // ---3

	final int x = random.nextInt(width - lineWidth - 1) + 1; // 保證畫在邊框之內
	final int y = random.nextInt(height - lineWidth - 1) + 1;
	final int xl = random.nextInt(lineWidth);
	final int yl = random.nextInt(lineWidth);
	graphics.drawLine(x, y, x + xl, y + yl);
}

// 取隨機產生的認證碼(4位數字)
final String resultCode = exctractRandCode();
for (int i = 0; i < resultCode.length(); i++) {
	// 將認證碼顯示到圖象中,調用函數出來的顏色相同,可能是因爲種子太接近,所以只能直接生成
	// graphics.setColor(new Color(20 + random.nextInt(130), 20 + random
	// .nextInt(130), 20 + random.nextInt(130)));

    // 設置字體顏色
	graphics.setColor(Color.BLACK);
    // 設置字體樣式
//			graphics.setFont(new Font("Arial Black", Font.ITALIC, 18));
    graphics.setFont(new Font("Times New Roman", Font.BOLD, 24));
    // 設置字符,字符間距,上邊距
	graphics.drawString(String.valueOf(resultCode.charAt(i)), (23 * i) + 8, 26);
}

// 將認證碼存入SESSION
request.getSession().setAttribute(SESSION_KEY_OF_RAND_CODE, resultCode);
// 圖象生效
graphics.dispose();

// 輸出圖象到頁面
ImageIO.write(image, "JPEG", response.getOutputStream());

運行服務之後,通過日誌,發現驗證碼生成輸出正常。查看代碼,發現Graphics2D在生成文本的時候,其實調用了Font組件

進入font源碼:

系統代碼中使用的字體是“Times New Roman”,本地測試驗證碼圖片沒問題,是因爲window平臺是有該字體的,查看對應服務器上的系統字體:

https://img-blog.csdn.net/20170930180211561?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvenMyOTYzMzI0Nzg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

以及系統的字體列表:

https://img-blog.csdn.net/20170930180236282?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvenMyOTYzMzI0Nzg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

發現並沒有我們需要的字體,於是基本可以確定問題點是出在系統字體上面。

解決方法很直接,就是直接到windows的字體目錄下https://img-blog.csdn.net/20170930180539608?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvenMyOTYzMzI0Nzg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

選擇該字體,直接上傳到服務器的字體文件目錄下,可以創建自定義目錄:(我是新建了Times New Roman的目錄,將拷貝出來的字體放在了此目錄下)

然後利用命令:fc-cache 重新載入字體配置,清除字體緩存。然後重啓項目,發現一切ok

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章