java验证码生成及前端(Vue)显示

验证码生成

环境:
后端:Java
前端:Vue

效果图(页面画的不好,勉强凑活看):
在这里插入图片描述
前端主要代码:

<img @click="changeCode()" :src="getVerifyCode" style="width: 100px;" alt="验证码获取失败">

click方法用来刷新验证码,src是获取路径,:src赋值变量,这样我们修改了getVerifyCode的值就会改变获取路径。
定义路径变量:

getVerifyCode: '/user/getVerifyCode?' + new Date().getTime()

click事件:

changeCode () {
      this.getVerifyCode = '/user/getVerifyCode?' + new Date().getTime()
    }

后端主要代码:
入口:

 /* 获取验证码图片*/
    @GetMapping("/getVerifyCode")
    public void getVerificationCode(HttpServletResponse response, HttpServletRequest request) {
        try {
            int width = 200;
            int height = 69;
            BufferedImage verifyImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            //生成对应宽高的初始图片
            String randomText = VerifyCode.drawRandomText(width, height, verifyImg);
            //单独的一个类方法,出于代码复用考虑,进行了封装。
            //功能是生成验证码字符并加上噪点,干扰线,返回值为验证码字符
            request.getSession().setAttribute("verifyCode", randomText);
            response.setContentType("image/png");//必须设置响应内容类型为图片,否则前台不识别
            OutputStream os = response.getOutputStream(); //获取文件输出流
            ImageIO.write(verifyImg, "png", os);//输出图片流
            os.flush();
            os.close();//关闭流
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

对图片进行处理的类和方法:

package util;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.Random;

/**
 * @Description
 * @Auther WangJinguo
 * @Date 2022/1/12 10:55
 * @Version 1.0
 **/
/*对图片进行处理的类和方法*/

public class VerifyCode {

    public static String drawRandomText(int width, int height, BufferedImage verifyImg) {

        Graphics2D graphics = (Graphics2D) verifyImg.getGraphics();
        graphics.setColor(Color.WHITE);//设置画笔颜色-验证码背景色
        graphics.fillRect(0, 0, width, height);//填充背景
        graphics.setFont(new Font("微软雅黑", Font.BOLD, 40));
        //数字和字母的组合
        String baseNumLetter = "123456789abcdefghijklmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ";
        StringBuffer sBuffer = new StringBuffer();
        int x = 10;  //旋转原点的 x 坐标
        String ch = "";
        Random random = new Random();
        for (int i = 0; i < 4; i++) {
            graphics.setColor(getRandomColor());
            //设置字体旋转角度
            int degree = random.nextInt() % 30;  //角度小于30度
            int dot = random.nextInt(baseNumLetter.length());
            ch = baseNumLetter.charAt(dot) + "";
            sBuffer.append(ch);
            //正向旋转
            graphics.rotate(degree * Math.PI / 180, x, 45);
            graphics.drawString(ch, x, 45);
            //反向旋转
            graphics.rotate(-degree * Math.PI / 180, x, 45);
            x += 48;
        }
        //画干扰线
        for (int i = 0; i < 6; i++) {
            // 设置随机颜色
            graphics.setColor(getRandomColor());
            // 随机画线
            graphics.drawLine(random.nextInt(width), random.nextInt(height),
            random.nextInt(width), random.nextInt(height));
        }
        //添加噪点
        for (int i = 0; i < 30; i++) {
            int x1 = random.nextInt(width);
            int y1 = random.nextInt(height);
            graphics.setColor(getRandomColor());
            graphics.fillRect(x1, y1, 2, 2);
        }
        return sBuffer.toString();

    }

    /**
     * 随机取色
     */

    private static Color getRandomColor() {
        Random ran = new Random();
        Color color = new Color(ran.nextInt(256),
        ran.nextInt(256), ran.nextInt(256));
        return color;
    }

}

下一章讲一下登陆时如何校验验证码:https://blog.csdn.net/weixin_45732391/article/details/122654760

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 在Spring Boot项目中引入验证码依赖 ```xml <dependency> <groupId>com.github.axet</groupId> <artifactId>kaptcha</artifactId> <version>0.0.9</version> </dependency> ``` 2. 添加Kaptcha配置类 ```java @Configuration public class KaptchaConfig { @Bean public DefaultKaptcha producer() { Properties properties = new Properties(); properties.setProperty("kaptcha.border", "no"); properties.setProperty("kaptcha.textproducer.font.color", "black"); properties.setProperty("kaptcha.image.width", "150"); properties.setProperty("kaptcha.image.height", "50"); properties.setProperty("kaptcha.textproducer.char.length", "4"); properties.setProperty("kaptcha.textproducer.char.string", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"); Config config = new Config(properties); DefaultKaptcha defaultKaptcha = new DefaultKaptcha(); defaultKaptcha.setConfig(config); return defaultKaptcha; } } ``` 3. 添加验证码生成接口 ```java @RestController public class CaptchaController { @Autowired private DefaultKaptcha defaultKaptcha; @GetMapping("/captcha.jpg") public void captcha(HttpServletRequest request, HttpServletResponse response) throws Exception { HttpSession session = request.getSession(); response.setHeader("Cache-Control", "no-store, no-cache"); response.setContentType("image/jpeg"); String text = defaultKaptcha.createText(); session.setAttribute("captcha", text); BufferedImage image = defaultKaptcha.createImage(text); ServletOutputStream out = response.getOutputStream(); ImageIO.write(image, "jpg", out); out.flush(); out.close(); } } ``` 4. 在前端页面中添加验证码图片和输入框 ```html <template> <div> <div class="form-group"> <label for="captcha">验证码</label> <div class="input-group"> <input type="text" class="form-control" id="captcha" name="captcha" v-model="captchaCode" placeholder="请输入验证码" required> <span class="input-group-append"> <img src="/captcha.jpg" @click="refreshCaptcha" alt="验证码" style="cursor: pointer;"> </span> </div> </div> </div> </template> ``` 5. 在Vue组件中添加刷新验证码方法和提交表单方法 ```js <script> export default { data() { return { captchaCode: '', formData: { // 表单数据 } } }, methods: { refreshCaptcha() { document.querySelector('img').src = '/captcha.jpg?' + Math.random() }, submitForm() { axios.post('/api/login', this.formData).then(res => { // 处理登录结果 }) } } } </script> ``` 6. 在后端中验证验证码 ```java @PostMapping("/login") public Result login(@RequestBody LoginForm form, HttpSession session) { String captcha = (String) session.getAttribute("captcha"); if (StringUtils.isBlank(captcha) || !captcha.equalsIgnoreCase(form.getCaptcha())) { return Result.error("验证码不正确"); } // 验证通过,进行登录操作 // ... } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值