Day23--前后端分离项目中如何使用 Vue.js 和 Axios 加载 WebServlet 生成的验证码图片

在前后端分离的项目中,使用 Vue.js 作为前端框架,通过 Axios 向后端发送请求以获取验证码图片是一个常见的场景。本文将介绍如何在 Vue 项目中通过 Axios 从后端 WebServlet 获取验证码图片流,并将其加载到前端页面中。

1. 需求分析

在许多应用中,验证码用于防止自动化脚本进行恶意操作。验证码图片通常由后端生成,然后前端需要通过 API 获取并展示。我们假设后端使用 Java WebServlet 来生成验证码图片,并将其作为二进制数据流返回给前端。前端使用 Vue.js 进行页面展示,并通过 Axios 发送 HTTP 请求。

2. 后端 WebServlet 生成验证码图片

首先,在后端,我们需要一个 WebServlet 来生成并返回验证码图片。下面是一个简单的示例:

package service;
import cn.dsna.util.images.*;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/code")
public class code extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //创建了一个 ValidateCode 实例,传入四个参数:
        //第一个参数是验证码图像的宽度(500 像素)。
        //第二个参数是验证码图像的高度(200 像素)。
        //第三个参数是验证码字符的数量(4 个字符)。
        //第四个参数是干扰线的数量(100 条线)。
        ValidateCode validateCode = new ValidateCode(500,200,4,100);
        //拿到生成的验证码值
        String code = validateCode.getCode();
//将生成的验证码字符串存储到 session 中,键为 "code"
// 这样可以在后续的请求中验证用户输入的验证码是否正确
        HttpSession sessions = req.getSession();
        sessions.setAttribute("code",code);
        //将生成的验证码图像写入到响应的输出流中。
        // 验证码图像会被发送给客户端显示。
        validateCode.write(resp.getOutputStream());
    }
}

此 WebServlet 处理 /captcha 路径的 GET 请求,生成验证码图片并将其作为 PNG 格式的响应返回。

3. 前端 Vue.js 中使用 Axios 请求验证码

在前端,我们使用 Axios 来发送请求并获取验证码图片数据。假设我们在一个 Vue 组件中加载验证码:

<template>
  <div>
    <img :src="captchaUrl" @click="loadCaptcha" alt="验证码" />
    <p>点击图片刷新验证码</p>
  </div>
</template>

<script>

    import axios from 'axios';

    new Vue({
    data() {
    return {
    captchaUrl: '', // 用于存储验证码图片的URL
};
},
    methods: {
    loadCaptcha() {
    // 请求后端的验证码图片
    axios.get('/captcha', { responseType: 'blob' }) // 确保响应类型为 blob
    .then(response => {
    const url = URL.createObjectURL(response.data); // 将 blob 转换为 URL
    this.captchaUrl = url;
})
    .catch(error => {
    console.error("获取验证码失败:", error);
});
}
},
    mounted() {
    this.loadCaptcha(); // 初始化时加载验证码
}
});
</script>
4. 关键技术点解析
  • responseType: 'blob': 在 Axios 请求中设置 responseType'blob',确保 Axios 将二进制数据作为 Blob 对象处理,这对于处理图片数据尤为重要。

  • URL.createObjectURL: 使用 URL.createObjectURL 方法将从后端获取的 Blob 数据转换为一个可供 <img> 标签使用的 URL。

  • 图片刷新: 当用户点击图片时,调用 loadCaptcha 方法重新请求验证码图片,从而实现验证码的刷新。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

IT ·南栀

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

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

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

打赏作者

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

抵扣说明:

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

余额充值