Vue + Vant + Koa2 + svg-captcha 实现图片验证码

继上一篇文章,实现了登陆功能,但是缺少一个验证码校验环节,今天和大家一起把图片验证码功能完善起来。

 

实现功能截图:

验证码校验,若验证码错误,返回错误信息,验证码正确,提示登录成功:

 

 

·验证码生成插件: svg-captcha

 

一、前端部分

前端采用 Vue + Vant 模式,验证码用 <van-image /> 展示出来。

 

1、引入:

import { Image as VanImage } from 'vant';

 

2、组件注册:

components:{
  ...
  ...
  [VanImage.name]: VanImage,
},

 

3、声明图片 src 变量,我们取名为 imageSrc :

data() {
  return {
    ...
    ...
    imageSrc: '',
  }
}

 

4、在 <template> </template> 中添加:

<van-field
  center
  clearable
  label="验证码"
  placeholder="请输入验证码"
>
  <template #right-icon>              <!-以插槽形式注入验证码 ->
    <van-image :src="imageSrc" width="80" height="40" @click="_updatePicCode" />
  </template>
</van-field>

 

 5、添加 created() 方法以及点击更新验证码方法:

created() {
  this.$nextTick(() => this._updatePicCode())
}
methods: {
  _updatePicCode() {
    this.imageSrc = 'http://localhost:3000/users/sendPicCode?d=' + Math.random();
  },
}

 created() 中, this.$nextTick() 的用法,请参考: https://www.cnblogs.com/tugenhua0707/p/11756584.html#top

 

6、设置 axios(重点),注意因为获取验证码涉及跨域请求,并且后台生成的验证码需要存储于 cookies 中,而 cookies 是随着请求在前端与后端之前来回发送的,因此需要:

axios.defaults.withCredentials = true; // 表示跨域请求时是否需要使用凭证,跨域访问需要发送cookie时一定要加

否则,点击登录按钮后,后端进行验证码比对时,是获取不到 cookies 中的验证码,也就无法比对验证码的正确性。

 

二、后端部分:

1、在 routes/users.js 中添加响应路由:

/**
 * 发送SVG图片验证码
 */
router.get('/sendPicCode', async function(ctx) {
  const picCode = tools.getCaptcha();
  // 将验证码保存入 session 中,与点击登录按钮之后,同用户输入的验证码进行比对
  ctx.session.picCode = picCode.text;
  // 指定返回的类型
  ctx.response.type = 'image/svg+xml';
  ctx.body = picCode.data;
})

 

2、验证码生成方法封装在 ./utils/tools.js :

const SvgCaptcha = require('svg-captcha');

/**
 * 工具封装
 */
class Tools {
  
  //返回SVG图片验证码
  getCaptcha() {
    const captcha = SvgCaptcha.create({
      size: 4,
      ignoreCharsL: 'o01i',
      noise: 1,
      color: true,
      background:  '#cc9966'
    });
    
    return captcha;
  }
}

 

好了,图片验证码就介绍到这里,如果文章中有不正确的地方,欢迎大家留意指正。

相关推荐:

Python爬虫如何绕过滑块验证码_使用cv2识别缺口位置自动模拟

滑块验证码不能用requests直接绕过,因其依赖前端拖动轨迹、加速度等行为验证,服务端校验token是否由真实拖动生成;cv2识别缺口需三步:用高对比度背景图、干净缺口模板、TM_CCOEFF_NORMED匹配;识别后还需模拟真实拖动行为,否则仍失败。 滑块验证码为什么不能用requests直接绕...

Python+Selenium4怎么绕过登录页面的滑块验证码

滑块验证码本质是行为检测而非图像识别,绕过关键在于模拟真实用户拖拽轨迹并禁用WebDriver自动化特征。需用ActionChains分段变速拖动、随机延迟、覆盖navigator.webdriver、删除cdc_属性,并处理iframe嵌套、动态缺口和背景图加载等细节。 滑块验证码本质是行为检测,...

Python二进制文件怎么读写_rb/wb模式处理图片与音频流

rb/wb模式读写图片音频时文件损坏,主因是Python原样搬运字节且不校验完整性:读不全、写错类型、换行符转义、帧边界错位、手动拼接字节等均会导致解析失败。 rb/wb模式读写图片时,为什么文件损坏或打不开 二进制模式不是“加个b就完事”,核心在于:Python不做编码转换,但也不帮你校验数据完整...

如何解决Python爬虫遇到滑块验证码无法通过的问题_使用OpenCV进行图像识别与缺口匹配

滑块验证码不能用requests直接模拟通过,因其依赖前端拖动轨迹、加速度、鼠标事件时序及Canvas指纹等行为验证;仅提交坐标或base64图片会返回{"success":false}或412错误。 滑块验证码为什么不能用requests直接模拟通过 因为滑块验证本质是前端行为验证:拖动轨迹、加速...