java实现验证码功能及上传服务器报错问题

该文章描述了一个使用Java后端生成登录验证码的实现,包括Controller和Service层的代码,以及前端ExtJS的HTML和JavaScript交互。在部署到Linux服务器时遇到字体配置相关的NullPointerException,解决方案是安装fontconfig库。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

场景:服务器上需要一个登录验证码功能

前端:extjs 后端:java 服务器:linux

先看后端生成验证码代码

controller代码

	/*
	 *获取图片验证码
	 */
	@GetMapping("/getMessage")
//	@CrossOrigin
	@NoSessionValidate
	public void getMessage(HttpServletResponse response, HttpServletRequest request){
		response.setHeader("Pragma","No-cache");
		response.setHeader("Cache-Control","No-cache");
		response.setDateHeader("Expires",0);
		response.setContentType("image/jpeg");
		String ip=request.getRemoteAddr();
		BufferedImage image= GetMessage.getMsg(request,ip);
		try {
			ImageIO.setUseCache(false);
			ImageIO.write(image,"JPG",response.getOutputStream());
			response.getOutputStream().flush();
			response.getOutputStream().close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

service代码

package com.hand.hcf.app.blf.profile.web;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.Random;

//生成验证码,并将验证码存入session中,以ip为key
public class GetMessage {
    public static BufferedImage getMsg(HttpServletRequest request,String ip){
        int width = 60 , height = 30;
        //创建一个图像,宽60 高30
        BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
        Graphics g = image.getGraphics();
        Random random = new Random();
        g.setColor(getRandomColor(200,250));
        g.fillRect(0,0,width,height);
        g.setFont(new Font("Times New Roman",Font.PLAIN,18));
        g.setColor(getRandomColor(160,200));
        //干扰线生成
        for (int i = 0; i < 10; i++) {
            int x = random.nextInt(width);
            int y = random.nextInt(height);
            int xl = random.nextInt(12);
            int yl = random.nextInt(12);
            g.drawLine(x,y,x+xl,y+yl);
        }
        String strCode = "";
        for (int i = 0; i < 4; i++) {
            String strNumber = String.valueOf(random.nextInt(10));
            strCode = strCode+strNumber;
            //设置字体颜色
            g.drawString(strNumber,13*i+6,20);
        }
//        System.out.println("当前ip"+ip);
//        System.out.println("当前验证码"+strCode);
        request.getSession().setAttribute(ip,strCode);
        HttpSession session = request.getSession();
        session.setAttribute("strCode",strCode);
        g.dispose();
        return image;
    }


    /**
     * 随机获取颜色的方法
     * @return
     */
    public static Color getRandomColor (int fc , int bc){
        Random random = new Random();
        Color reandomColor = null;
        if(fc > 255){
            fc = 255;
        }
        if(bc > 255){
            bc = 255;
        }
        int r =fc + random.nextInt(bc-fc);
        int g = fc + random.nextInt(bc-fc);
        int b = fc + random.nextInt(bc-fc);
        reandomColor = new Color(r,g,b);
        return reandomColor;
    }
}

前端
html

 <div class="form-group">
            <label class="control-label">验证码</label>
            <div class="input-icon">
                <input  type="text" autocomplete="off" id="verificationCode"
                       name="verificationCode" onkeydown="if(event.keyCode==13){login()}"/>
                <img id="strCodeImg" width="120" height="43" onclick="takeCode()"
                     style="border: 1px solid #ccc; border-radius: 5px;">
            </div>
        </div>

js
为了防止服务器缓存,点击图片但是不进行刷新验证码,连接后面加上随机参数,但是后端不对其进行处理

    //验证码

    function takeCode() {
    	//为了防止服务器缓存,点击图片但是不进行刷新验证码,连接后面加上随机参数,但是后端不对其进行处理
        document.getElementById("strCodeImg").src = "/api/login/getMessage?r="+Math.random();
    }

成品
在这里插入图片描述

但是部署到服务器上发生了报错,先看错误(由于报错太长,就列举了最重要的错误)

Caused by: java.lang.reflect.InvocationTargetException: null
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:na]
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:na]
	at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:na]
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490) ~[na:na]
	at java.desktop/sun.font.FontManagerFactory$1.run(FontManagerFactory.java:84) ~[na:na]
	... 130 common frames omitted
Caused by: java.lang.NullPointerException: null
	at java.desktop/sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1262) ~[na:na]
	at java.desktop/sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:225) ~[na:na]
	at java.desktop/sun.awt.FontConfiguration.init(FontConfiguration.java:107) ~[na:na]
	at java.desktop/sun.awt.X11FontManager.createFontConfiguration(X11FontManager.java:719) ~[na:na]
	at java.desktop/sun.font.SunFontManager$2.run(SunFontManager.java:379) ~[na:na]
	at java.base/java.security.AccessController.doPrivileged(Native Method) ~[na:na]
	at java.desktop/sun.font.SunFontManager.<init>(SunFontManager.java:324) ~[na:na]
	at java.desktop/sun.awt.FcFontManager.<init>(FcFontManager.java:35) ~[na:na]
	at java.desktop/sun.awt.X11FontManager.<init>(X11FontManager.java:56) ~[na:na]
	... 135 common frames omitted

这个是字体问题,只需要在服务器上运行一下命令即可

yum install fontconfig
yum install -y fontconfig
yum install -y urw-fonts

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

今晚不想睡沙发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值