当前位置: 首页 > news >正文

网站空间信息查询近期新闻热点大事件

网站空间信息查询,近期新闻热点大事件,网站建设的业务流程图,涵江莆田交友网站一、实现效果 springboot使用EasyCaptcha实现简单验证码&#xff0c;更多api和用法可以去github上查看EasyCaptcha: Java图形验证码&#xff0c;支持gif、中文、算术等类型&#xff0c;可用于Java Web、JavaSE等项目。 二、实现步骤 1、导入依赖 <!-- easy-captcha --&g…

一、实现效果

springboot使用EasyCaptcha实现简单验证码,更多api和用法可以去github上查看EasyCaptcha: Java图形验证码,支持gif、中文、算术等类型,可用于Java Web、JavaSE等项目。

二、实现步骤 

1、导入依赖

<!-- easy-captcha -->
<dependency><groupId>com.github.whvcse</groupId><artifactId>easy-captcha</artifactId><version>1.6.2</version>
</dependency><!--    解决easy-captcha算术验证码报错问题    -->
<dependency><groupId>org.openjdk.nashorn</groupId><artifactId>nashorn-core</artifactId><version>15.4</version>
</dependency>

我使用的JDK版本是Java21,SpringBoot版本是3.2.0,如果不引入nashorn-core,生成验证码时会报错java.lang.NullPointerException: Cannot invoke "javax.script.ScriptEngine.eval(String)" because "engine" is null。有开发者反馈使用Java 17时也遇到了同样的问题,手动引入nashorn-core后即可解决该问题。

详细堆栈和截图如下:

 java.lang.NullPointerException: Cannot invoke "javax.script.ScriptEngine.eval(String)" because "engine" is nullat com.wf.captcha.base.ArithmeticCaptchaAbstract.alphas(ArithmeticCaptchaAbstract.java:42) ~[easy-captcha-1.6.2.jar:na]at com.wf.captcha.base.Captcha.checkAlpha(Captcha.java:156) ~[easy-captcha-1.6.2.jar:na]at com.wf.captcha.base.Captcha.text(Captcha.java:137) ~[easy-captcha-1.6.2.jar:na]at com.fast.alden.admin.service.impl.AuthServiceImpl.generateVerifyCode(AuthServiceImpl.java:72) ~[classes/:na]......

 2、后端代码

@RestController
@RequestMapping()
public class EasyCaptchaController {@GetMapping("/specCaptcha")public Result createSpecCaptcha() throws Exception {// png类型SpecCaptcha specCaptcha = new SpecCaptcha(130, 48, 5);//设置验证码字符类型,只有SpecCaptcha和GifCaptcha设置才有效果。//specCaptcha.setCharType(Captcha.TYPE_ONLY_NUMBER);// 设置内置字体//specCaptcha.setFont(Captcha.FONT_1);// 获取验证码字符串,并转为小写,后续可以存储到redis中方便校验String verCode = specCaptcha.text().toLowerCase();String specCaptchaBase64 = specCaptcha.toBase64();return Result.success(specCaptchaBase64);}@GetMapping("/gifsCaptcha")public Result createGifCaptcha() throws Exception {// gif类型GifCaptcha gifCaptcha = new GifCaptcha(130, 48, 5);// 获取验证码字符串,并转为小写,后续可以存储到redis中方便校验String verCode = gifCaptcha.text().toLowerCase();String specCaptchaBase64 = gifCaptcha.toBase64();return Result.success(specCaptchaBase64);}@GetMapping("/chineseCaptcha")public Result createChineseCaptcha() throws Exception {// 中文类型ChineseCaptcha chineseCaptcha = new ChineseCaptcha(130, 48, 5);// 获取验证码字符串,后续可以存储到redis中方便校验String verCode = chineseCaptcha.text();String specCaptchaBase64 = chineseCaptcha.toBase64();return Result.success(specCaptchaBase64);}@GetMapping("/chineseGifCaptcha")public Result createChineseGifCaptcha() throws Exception {// 中文gif类型ChineseGifCaptcha chineseGifCaptcha = new ChineseGifCaptcha(130, 48,5);// 获取验证码字符串,后续可以存储到redis中方便校验String verCode = chineseGifCaptcha.text().toLowerCase();String specCaptchaBase64 = chineseGifCaptcha.toBase64();return Result.success(specCaptchaBase64);}@GetMapping("/arithmeticCaptcha")public Result createArithmeticCaptcha() throws Exception {// 算术类型ArithmeticCaptcha captcha = new ArithmeticCaptcha(130, 48);captcha.setLen(3);  // 几位数运算,默认是两位captcha.getArithmeticString();  // 获取运算的公式:3+2=?String text = captcha.text();// 获取运算的结果:5String arithmeticCaptchaBase64 = captcha.toBase64();return Result.success(arithmeticCaptchaBase64);}}

3、前端代码

api

import request from "@/utils/request";
export const getSpecCaptcha = () => {return request({url: "/specCaptcha",method: "get",});
};
export const getGifsCaptcha = () => {return request({url: "/gifsCaptcha",method: "get",});
};
export const getChineseCaptcha = () => {return request({url: "/chineseCaptcha",method: "get",});
};
export const getChineseGifCaptcha = () => {return request({url: "/chineseGifCaptcha",method: "get",});
};
export const getArithmeticCaptcha = () => {return request({url: "/arithmeticCaptcha",method: "get",});
};

 vue

<template><div class="captcha"><h1>验证码</h1><div class="easy-captcha"><h3>easy-captcha</h3><span>SpecCaptcha:<img :src="SpecCaptcha" alt="验证码" @click="changeCaptchaImg('Spec')"/></span><span>GifsCaptcha:<img :src="GifsCaptcha" alt="验证码" @click="changeCaptchaImg('Gifs')"/></span><span>ChineseCaptcha:<img:src="ChineseCaptcha"alt="验证码"@click="changeCaptchaImg('Chinese')"/></span><span>ChineseGifCaptcha:<img:src="ChineseGifCaptcha"alt="验证码"@click="changeCaptchaImg('ChineseGif')"/></span><span>ArithmeticCaptcha:<img:src="ArithmeticCaptcha"alt="验证码"@click="changeCaptchaImg('Arithmetic')"/></span></div></div>
</template><script setup>
import { ref, onMounted, onBeforeUnmount } from "vue";
import {getSpecCaptcha,getGifsCaptcha,getChineseCaptcha,getChineseGifCaptcha,getArithmeticCaptcha,
} from "@/api/captcha/index";
import { ElMessage } from "element-plus";const SpecCaptcha = ref("");
const GifsCaptcha = ref("");
const ChineseCaptcha = ref("");
const ChineseGifCaptcha = ref("");
const ArithmeticCaptcha = ref("");const captchaRefs = {Spec: SpecCaptcha,Gifs: GifsCaptcha,Chinese: ChineseCaptcha,ChineseGif: ChineseGifCaptcha,Arithmetic: ArithmeticCaptcha,
};const getCaptcha = async (captchaType) => {try {let res;switch (captchaType) {case "Spec":res = await getSpecCaptcha();break;case "Gifs":res = await getGifsCaptcha();break;case "Chinese":res = await getChineseCaptcha();break;case "ChineseGif":res = await getChineseGifCaptcha();break;case "Arithmetic":res = await getArithmeticCaptcha();break;default:throw new Error("Invalid captcha type");}captchaRefs[captchaType].value = res.data;} catch (error) {console.error(`获取 ${captchaType} 验证码时出错:`, error);ElMessage.error(`获取 ${captchaType} 验证码时出错,请稍后再试`);}
};const changeCaptchaImg = async (captchaType) => {await getCaptcha(captchaType);
};const revokeCaptchaUrls = () => {for (const captchaType in captchaRefs) {if (captchaRefs[captchaType].value) {URL.revokeObjectURL(captchaRefs[captchaType].value);}}
};onMounted(async () => {await Promise.all([getCaptcha("Spec"),getCaptcha("Gifs"),getCaptcha("Chinese"),getCaptcha("ChineseGif"),getCaptcha("Arithmetic"),]);
});onBeforeUnmount(() => {revokeCaptchaUrls();
});
</script><style lang="scss" scoped></style>

http://www.mmbaike.com/news/77503.html

相关文章:

  • 乐山网站建设公司客户关系管理系统
  • 东营网站建设推广哪家好免费推广网站大全集合
  • 网站内容优化方法长沙seo优化推广公司
  • 做响应式网站的菜单栏seo免费浏览网站
  • 广州萝岗区网站建设品牌企业seo咨询
  • 合作公司做网站广州今日新闻头条新闻
  • 苏州代做淘宝网站简述网站制作的步骤
  • php做视频网站seo培训机构哪家好
  • 企业大型网站开发百度做广告费用
  • 做网站建设最好学什么厦门seo排名
  • 诸城网站建设哪家好友情链接英文
  • 手机网站打开很慢上海广告公司排名
  • 摄影网站建设方案网络营销的推广手段
  • 偃师网站制作百度关键词推广帝搜软件
  • 做网站教程 第一课50篇经典软文100字
  • 一个网站如何做cdn加速西安seo站内优化
  • 网站开发工程师需要什么证书网络营销未来有哪些发展趋势
  • wordpress 定时任务网站做优化好还是推广好
  • 计算机作业做网站seo优化包括哪些
  • 武汉学习网站制作一键优化清理手机
  • 网站建设好了怎么弄手机网站建设营销手段有哪些方式
  • 简单的网页设计模板图片合肥搜索引擎优化
  • wordpress 附件显示设置seo外链建设的方法
  • 沈阳网站建设的公司如何规划企业网络推广方案
  • 招聘网页制作人员网站seo的优化怎么做
  • 谷歌推广网站建设河南智能seo快速排名软件
  • 家具定制东莞网站建设百度一下百度网页版
  • 手机网站自动适应网站优化推广费用
  • 做网站时需要FTP工具吗技师培训
  • 做网站收益专业搜索引擎seo合作