Vue前端中从后端获取图片验证码

  • 前端发送请求
html 复制代码
<template>
  <el-form :model="user" :rules="rules" ref="userForm" class="login" label-width="auto" style="max-width: 600px">
    <el-form-item label="用户名" prop="name" >
      <el-input v-model="user.name" id="name" placeholder="请输入用户名" />
    </el-form-item>
    <el-form-item label="密码" prop="pass">
      <el-input v-model="user.pass" id="pass" placeholder="请输入密码"/>
    </el-form-item>

    <el-form-item label="验证码" prop="captcha">
      <el-input v-model="user.captcha" id="captcha" placeholder="请输入验证码"/>
      <img :src="captchaUrl" alt="验证码" @click="refreshCaptcha">
    </el-form-item>
    <el-form-item>
      <el-button type="primary" @click="onSubmit" class="btn">登录</el-button>
    </el-form-item>

  </el-form>
</template>

<script lang="ts" setup>
import {onMounted, reactive, ref} from 'vue'
import Schema from "async-validator";
import {ElMessage} from "element-plus";
import axios from "axios";
// 响应式的对象
const user = reactive({
  name: '',
  pass: '',
  captcha:''
})

// 设置验证规则
const rules = {
  name: [
    { required: true, message: '请输入用户名', trigger: 'blur' },
    { min: 3, max: 30, message: '长度在 3 到 30 个字符', trigger: 'blur' },
  ],
  pass: [{ required: true, message: '请输入密码', trigger: 'blur' }],
}


//  创建对表单的引用
const userForm = ref(null);

// 点击登录按钮的时候,验证是否满足rules规则
const onSubmit = () => {
  if (userForm.value){
    userForm.value.validate((valid: boolean)=>{
      if (valid){
        //验证通过,执行登录逻辑
        console.log(user);
        ElMessage.success("登录成功")
      }else {
        //表单验证未通过,显示错误信息
        ElMessage.error("请检查输入的内容")
        return false
      }
    })
  }
}


// 验证码
// 使用 ref 创建响应式数据
const captchaUrl =  ref('');
// 刷新验证码
const refreshCaptcha = ()=>{
  axios.get('http://localhost:8080/captcha',{responseType : 'blob'})
      .then(response =>{
        captchaUrl.value = URL.createObjectURL(new Blob([response.data]));
      })
      .catch(error=>{
        console.log("获取验证码失败",error)
      })
}

// 组件挂载时加载验证码
onMounted(()=>{
  refreshCaptcha();
})
</script>
  • 后端响应
java 复制代码
@RestController
@Slf4j
public class LoginController {
    //获取验证码
    @CrossOrigin
    @GetMapping("/captcha")
    public void captcha(HttpServletResponse response, HttpServletRequest request) throws IOException {
        SpecCaptcha captcha = new SpecCaptcha(150,40);
        String text = captcha.text();
        captcha.out(response.getOutputStream());
    }

}
  • 解决跨域
java 复制代码
package com.kfm.bisheserve.config;

import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * @author 27359
 * date:2024/5/29
 */
public class CorsWebMvcConfig implements WebMvcConfigurer {
//    配置CORS映射
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")  //这个映射适用于所有URL模式(/**),表示对于所有请求,都应用这个CORS配置
                .allowedOriginPatterns("/**")  //这意味着允许所有域名的请求访问你的后端服务。
                .allowedMethods("*")  //这意味着允许所有类型的HTTP请求(如GET、POST、PUT、DELETE等)。
                .allowCredentials(true) //这通常与Access-Control-Allow-Origin响应头一起使用,以允许跨域请求携带cookie。
                .maxAge(3600)  //这意味着浏览器可以缓存预检请求的结果,避免在每次跨域请求时都发送预检请求
                .allowedHeaders("*"); //这意味着允许所有类型的请求头。
    }
}
相关推荐
南半球与北海道#11 分钟前
前端引入vue-super-flow流程图插件
前端·vue.js·流程图
然我17 分钟前
React 16.8:不止 Hooks 那么简单,这才是真正的划时代更新 🚀
前端·react.js·前端框架
小高00731 分钟前
📈前端图片压缩实战:体积直降 80%,LCP 提升 2 倍
前端·javascript·面试
OEC小胖胖34 分钟前
【React Hooks】封装的艺术:如何编写高质量的 React 自-定义 Hooks
前端·react.js·前端框架·web
BillKu42 分钟前
vue3+element-plus 输入框el-input设置背景颜色和字体颜色,样式效果等同于不可编辑的效果
前端·javascript·vue.js
每天学习一丢丢44 分钟前
Spring Boot + Vue 项目用宝塔面板部署指南
vue.js·spring boot·后端
惊悚的毛毛虫1 小时前
掘金免广告?不想看理财交流圈?不想看exp+8?
前端
springfe01011 小时前
vue3组件 - 大文件上传
前端·vue.js
再学一点就睡1 小时前
Vite 工作原理(简易版)—— 从代码看核心逻辑
前端·vite
好好好明天会更好1 小时前
uniapp项目中小程序的生命周期
前端·vue.js