当前位置:首页 > 科技  > 软件

使用Springboot3.x结合美学与功能的设计实现艺术风格验证码

来源: 责编: 时间:2024-05-16 09:07:44 88观看
导读这个专题深入浅出地探讨了各类验证码的生成和在Springboot3.x中的实践,从基础的滑动、点选、算术运算验证码到创新的艺术风格、水印、二维码验证码,适合所有Java开发者阅读。在这个专题中,不仅可以学习到技术实践,更能领

这个专题深入浅出地探讨了各类验证码的生成和在Springboot3.x中的实践,从基础的滑动、点选、算术运算验证码到创新的艺术风格、水印、二维码验证码,适合所有Java开发者阅读。在这个专题中,不仅可以学习到技术实践,更能领略到验证码的美学魅力。让我们一起探索验证码的无尽可能性。TGQ28资讯网——每日最新资讯28at.com

什么是艺术风格验证码

验证码,全名叫做 Completely Automated Public Turing Test to tell Computers and Humans Apart(全自动区分计算机和人类的图灵测试)。其主要目标是阻止机器自动进行某些操作,例如注册用户、提交表单等。TGQ28资讯网——每日最新资讯28at.com

而艺术风格验证码,可以看作是验证码的一种创新形式,它将数字艺术融入到这项安全措施中。艺术风格验证码的外观吸引人,增强了用户体验,同时也提高了验证码的安全等级。因为这种验证码在视觉上的差异性和复杂性使得对验证码的自动识别变得更加困难,提高了安全性。TGQ28资讯网——每日最新资讯28at.com

所谓艺术风格,包括但不限于各种视觉艺术形式,例如流行艺术、抽象艺术、最小主义艺术等。验证码的颜色、形状、过滤效果等都可以根据特定的艺术风格来设计。例如,我们可能将验证码中的数字或字母渲染成流行艺术风格,或者给验证码背景添加抽象艺术元素。TGQ28资讯网——每日最新资讯28at.com

艺术风格验证码的运行机制

艺术风格验证码的运行机制同普通验证码非常相似,但是它引入了额外的步骤来添加艺术效果。以下是其一般的工作流程:TGQ28资讯网——每日最新资讯28at.com

  1. 生成一组随机的字母或数字作为验证码的原始文本。
  2. 为每个字符生成一个基本的图形表示,通常是在图片中为每个字符分配一个特定的位置并进行绘制。
  3. 对生成的图片应用一系列艺术效果。这些效果可以包含颜色变换、模糊处理、波纹效果、旋转变形等。
  4. 将完成艺术效果处理的验证码图片展示给用户,并存储原始的验证码文本以供用户提交后进行比对验证。

下面通过一个基本的例子演示在Java环境下如何通过代码实现这个流程:TGQ28资讯网——每日最新资讯28at.com

public void generateArtisticVerificationCode() {    String verificationCode = RandomStringUtils.randomAlphanumeric(5); // 生成原始验证码文本    BufferedImage image = new BufferedImage(100, 40, BufferedImage.TYPE_INT_ARGB); // 创建图片对象    Graphics graphics = image.getGraphics(); // 获取画布    graphics.setFont(new Font("TimesRoman", Font.BOLD, 20)); // 设定字体    graphics.setColor(Color.BLACK); // 设定颜色    for (int i = 0; i < verificationCode.length(); i++) {        graphics.drawString(verificationCode.charAt(i) + "", 10 + i * 16, 28); // 在画布上绘制每个字符    }    applyArtisticEffects(image); // 应用艺术效果    // 将图片展示给用户,同时保留原始验证码文本以供后续验证}// 示例艺术效果应用函数public void applyArtisticEffects(BufferedImage image) {    // 这个函数会对图片应用各种艺术效果,包括但不限于颜色变换、模糊处理、波纹效果等    // 具体实现取决于你希望生成验证码的艺术风格}

在生成艺术风格验证码的过程中,我们首先生成了原始的验证码文本,并为每一个字符在图片上绘制了基本的图形表示。然后我们对图片应用了艺术效果处理。最后我们将处理过的验证码图片展示给用户,并保留原始的验证码文本,这样用户在提交时我们就可以对提交的验证码和原始的进行比对。TGQ28资讯网——每日最新资讯28at.com

技术实现:在Springboot3.x中如何生成艺术风格验证码

在Springboot3.x中生成艺术风格验证码,我们主要分为以下几步:TGQ28资讯网——每日最新资讯28at.com

  1. 创建验证码Controller
  2. 实现一个验证码服务
  3. 实现一个艺术效果应用服务

以下是详细的实现步骤和示例代码:TGQ28资讯网——每日最新资讯28at.com

创建验证码Controller

首先,我们需要创建一个Controller用于处理验证码相关的请求。这个Controller将和我们的验证码服务进行交互,接收用户请求并返回生成的验证码。TGQ28资讯网——每日最新资讯28at.com

@RestControllerpublic class VerificationCodeController {    @Autowired    private VerificationCodeService verificationCodeService;    @RequestMapping("/verificationCode")    public void getVerificationCode(HttpServletResponse response, HttpSession session) {        BufferedImage image = verificationCodeService.createVerificationImage();        session.setAttribute("VERIFICATION_CODE", verificationCodeService.getVerificationCode());        ImageIO.write(image, "jpeg", response.getOutputStream());    }}

在上述代码中,我们创建了一个名为VerificationCodeController的Controller。我们注入了VerificationCodeService用于生成验证码。我们定义了一个路由/verificationCode,用于接收HTTP请求并返回生成的验证码图片。TGQ28资讯网——每日最新资讯28at.com

实现验证码服务

验证码服务的责任是生成原始的验证码文本和验证码图片。TGQ28资讯网——每日最新资讯28at.com

@Servicepublic class VerificationCodeService {    @Autowired    private ArtisticEffectService artisticEffectService;    private String verificationCode;    public BufferedImage createVerificationImage() {        verificationCode = RandomStringUtils.randomAlphanumeric(5);        BufferedImage image = new BufferedImage(100, 40, BufferedImage.TYPE_INT_ARGB);        Graphics graphics = image.getGraphics();        graphics.setFont(new Font("TimesRoman", Font.BOLD, 20));        graphics.setColor(Color.BLACK);        for (int i = 0; i < verificationCode.length(); i++) {            graphics.drawString(verificationCode.charAt(i) + "", 10 + i * 16, 28);        }        artisticEffectService.applyArtisticEffects(image);        return image;    }    public String getVerificationCode() {        return verificationCode;    }}

实现艺术效果应用服务

艺术效果应用服务用于对验证码图片应用艺术效果。TGQ28资讯网——每日最新资讯28at.com

@Servicepublic class import java.awt.AlphaComposite;import java.awt.Color;import java.awt.GradientPaint;import java.awt.Graphics2D;import java.awt.image.BufferedImage;import java.awt.image.ConvolveOp;import java.awt.image.Kernel;import org.springframework.stereotype.Service;@Servicepublic class ArtisticEffectService {    public void applyArtisticEffects(BufferedImage image) {        Graphics2D graphics = (Graphics2D) image.getGraphics();        // 添加线性渐变效果        GradientPaint paint = new GradientPaint(0, 0, Color.BLUE, image.getWidth(), 0, Color.RED);        graphics.setPaint(paint);        graphics.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.5f));        graphics.fillRect(0, 0, image.getWidth(), image.getHeight());        // 添加模糊效果        float ninth = 1.0f/9.0f;        float[] blurKernel = {            ninth, ninth, ninth,            ninth, ninth, ninth,            ninth, ninth, ninth        };        ConvolveOp op = new ConvolveOp(new Kernel(3, 3, blurKernel));        BufferedImage blurredImage = op.filter(image, null);        graphics.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));        graphics.drawImage(blurredImage, 0, 0, null);    }}

在上述代码中,我们首先使用GradientPaint创建了一个从左边的蓝色向右边的红色逐渐变化的线性渐变效果,然后使用AlphaComposite将这个渐变效果和原来的图像合成在一起。TGQ28资讯网——每日最新资讯28at.com

接着,我们创建了一个模糊核(blur kernel)并使用ConvolveOp将模糊效果应用到现有的图像上。TGQ28资讯网——每日最新资讯28at.com

实战应用:艺术风格验证码的应用示例

在接下来的示例中,我们将实现一个功能更为完善的Spring Boot应用程序,该程序包含一个Web页面,用户可以从该页面请求新的艺术风格验证码,并提交输入以进行验证。TGQ28资讯网——每日最新资讯28at.com

以下是我们的应用程序的主要组件:TGQ28资讯网——每日最新资讯28at.com

  1. 验证码生成服务
  2. Web控制器
  3. Vue.js前端应用

验证码生成服务

我们先前已经实现了一个验证码服务和艺术效果服务,现在我们可以将其集成到我们的Spring Boot应用中。TGQ28资讯网——每日最新资讯28at.com

@Servicepublic class VerificationCodeService {    private String verificationCode;    @Autowired    private ArtisticEffectService artisticEffectService;    public String createVerificationCode() {        verificationCode = RandomStringUtils.randomAlphanumeric(5);        return verificationCode;    }    public BufferedImage createVerificationImage() {        String code = createVerificationCode();        BufferedImage image = new BufferedImage(100, 40, BufferedImage.TYPE_INT_ARGB);        Graphics graphics = image.getGraphics();        graphics.setFont(new Font("Arial", Font.BOLD, 24));        graphics.setColor(Color.BLACK);        for (int i = 0; i < verificationCode.length(); i++) {            graphics.drawString(code.charAt(i) + "", 10 + i * 16, 32);        }        artisticEffectService.applyArtisticEffects(image);        return image;    }    public boolean verifyCode(String userInput) {        return userInput.equals(verificationCode);    }}

在这里,我们将为这个方法实现倾斜角度变化和图片抖动这两种常见的艺术样式。TGQ28资讯网——每日最新资讯28at.com

import java.awt.Color;import java.awt.Font;import java.awt.FontMetrics;import java.awt.Graphics2D;import java.awt.RenderingHints;import java.awt.image.BufferedImage;import java.util.Random;import org.springframework.stereotype.Service;@Servicepublic class ArtisticEffectService {    // 旋转给定的图像    public BufferedImage rotateImage(BufferedImage image) {        int width = image.getWidth();        int height = image.getHeight();        BufferedImage rotatedImage = new BufferedImage(width, height, image.getType());        Graphics2D graphics2D = rotatedImage.createGraphics();        double theta = Math.toRadians(new Random().nextInt(40) - 20);  // 在-20到20度之间随机旋转        graphics2D.rotate(theta, width / 2, height / 2);        graphics2D.drawImage(image, 0, 0, null);        graphics2D.dispose();        return rotatedImage;    }    // 对给定的字符串应用底噪音和干扰线    public BufferedImage applyArtisticEffects(BufferedImage image) {        int width = image.getWidth();        int height = image.getHeight();        Random random = new Random();        // 底部噪声        for (int i = 0; i < 30; i++) {            int x = random.nextInt(width);            int y = random.nextInt(height);            int rgb = getRandomRgb();            image.setRGB(x, y, rgb);        }        // 干扰线        Graphics2D graphics2D = image.createGraphics();        for (int i = 0; i < 5; i++) {            int x = random.nextInt(width);            int y = random.nextInt(height);            int xl = random.nextInt(width);            int yl = random.nextInt(height);            graphics2D.setColor(new Color(getRandomRgb()));            graphics2D.drawLine(x, y, x + xl, y + yl);        }        graphics2D.dispose();        return rotateImage(image);    }    // 生成随机的RGB颜色    private int getRandomRgb() {        Random random = new Random();        int red = random.nextInt(256);        int green = random.nextInt(256);        int blue = random.nextInt(256);        return (red << 16) | (green << 8) | blue;    }}

在上述代码中,我们首先为验证码图片添加底部噪声和干扰线,然后随机地旋转图片角度。这将确保每一次生成的验证码图片都是独一无二的,并能有效地防止机器人自动识别。TGQ28资讯网——每日最新资讯28at.com

Web控制器

接下来,我们需要创建一个Web控制器来处理用户的HTTP请求。我们将创建两个路由,一个用于生成和获取验证码,另一个用于验证用户输入的验证码。TGQ28资讯网——每日最新资讯28at.com

@RestController@RequestMapping("/api")public class VerificationCodeController {    @Autowired    private VerificationCodeService verificationCodeService;    @GetMapping("/verificationCode")    public ResponseEntity<byte[]> getVerificationCode() throws IOException {        BufferedImage image = verificationCodeService.createVerificationImage();        ByteArrayOutputStream bos = new ByteArrayOutputStream();        ImageIO.write(image, "png", bos);        byte[] imageBytes = bos.toByteArray();        return ResponseEntity.ok().contentType(MediaType.IMAGE_PNG).body(imageBytes);    }    @PostMapping("/verify")    public ResponseEntity<Boolean> verifyCode(@RequestBody String userInput) {        boolean isCorrect = verificationCodeService.verifyCode(userInput);        return ResponseEntity.ok(isCorrect);    }}

在上述代码中,getVerificationCode方法处理GET请求并返回新的验证码图像。我们将返回的验证码图像存储为一个字节数组,以便将其作为HTTP响应的一部分发送回客户端。TGQ28资讯网——每日最新资讯28at.com

verifyCode方法接收用户的验证码输入,并通过与存储在服务端的验证码进行比较来验证输入是否正确。TGQ28资讯网——每日最新资讯28at.com

前端应用

综合以上所述,我们已经成功地在后端实现验证码的生成和验证。现在,我们需要一个前端用户界面来显示验证码,并提供一个输入框让用户输入验证码。TGQ28资讯网——每日最新资讯28at.com

在这个例子中,我们将使用Vue.js来实现前端应用。前端应用将包含一个图像组件用来显示验证码,一个文本框用于用户输入,以及一个按钮用于提交用户输入。TGQ28资讯网——每日最新资讯28at.com

<template>  <div id="app">    <img :src="`data:image/png;base64,${captchaImage}`" @click="refreshCaptcha" />    <input v-model="userInput" type="text" placeholder="Enter the captcha" />    <button @click="verifyCaptcha">Submit</button>  </div></template><script>export default {  data() {    return {      captchaImage: '',      userInput: ''    }  },  methods: {    refreshCaptcha() {      axios.get('/api/verificationCode', { responseType: 'arraybuffer' })        .then(response => {          let base64 = btoa(new Uint8Array(response.data).reduce((data, byte) => data + String.fromCharCode(byte), ''));          this.captchaImage = base64;        });    },    verifyCaptcha() {      axios.post('/api/verify', this.userInput)        .then(response => {          if (response.data) {            alert("The captcha is correct.");          } else {            alert("The captcha is incorrect.");            this.refreshCaptcha();          }        });    }  },  mounted() {    this.refreshCaptcha();  }}</script>

在上述代码中,我们使用Vue.js提供的两个生命周期钩子:methods中的refreshCaptcha方法获取新的验证码,mounted中的refreshCaptcha在页面加载时调用。在验证码提交后,一个警告会告诉用户提交的验证码是否正确。如果验证码不正确,将会刷新新的验证码。TGQ28资讯网——每日最新资讯28at.com

通过这种方式,我们成功创建了一个艺术风格验证码的完整应用示例,包含后端的验证码生成、前端的验证码展示和用户输入验证等完整流程。TGQ28资讯网——每日最新资讯28at.com

本文主要介绍了如何实现一个艺术风格的验证码系统,过程包含生成验证码、应用艺术效果、及其在前后端的实现。验证码生成部分,通过Java的RandomStringUtils工具生成随机字符串作为验证码。艺术效果应用部分,实现了噪点扰动和模糊效果,来增强验证码的安全性同时赋予其独特的艺术风格。在后端,我们创建了一个Spring Boot应用,实现了验证码的生成并返回给前端;在前端部分,我们使用Vue.js创建了一个用户界面单元,用户可以进行验证码的获取与输入验证。这样的系统结构使得验证码的生成及验证过程更为灵活与高效。TGQ28资讯网——每日最新资讯28at.com

TGQ28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-88350-0.html使用Springboot3.x结合美学与功能的设计实现艺术风格验证码

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: MQ消息积压,把我整吐血了

下一篇: 程序员为什么一定要去造几个轮子

标签:
  • 热门焦点
  • K60 Pro官方停产 第三方瞬间涨价

    K60 Pro官方停产 第三方瞬间涨价

    虽然没有官方宣布,但Redmi的一些高管也已经透露了,Redmi K60 Pro已经停产且不会补货,这一切都是为了即将到来的K60 Ultra铺路,属于厂家的正常操作。但有意思的是该机在停产之后
  • K60至尊版狂暴引擎2.0加持:超177万跑分斩获性能第一

    K60至尊版狂暴引擎2.0加持:超177万跑分斩获性能第一

    Redmi的后性能时代战略发布会今天下午如期举办,在本次发布会上,Redmi公布了多项关于和联发科的深度合作,以及新机K60 Ultra在软件和硬件方面的特性,例如:“K60 至尊版,双芯旗舰
  • 小米官宣:2023年上半年出货量中国第一!

    小米官宣:2023年上半年出货量中国第一!

    今日早间,小米电视官方微博带来消息,称2023年小米电视上半年出货量达到了中国第一,同时还表示小米电视的巨屏风暴即将开始。“公布一个好消息2023年#小米电视上半年出货量中国
  • 一篇聊聊Go错误封装机制

    一篇聊聊Go错误封装机制

    %w 是用于错误包装(Error Wrapping)的格式化动词。它是用于 fmt.Errorf 和 fmt.Sprintf 函数中的一个特殊格式化动词,用于将一个错误(或其他可打印的值)包装在一个新的错误中。使
  • 使用LLM插件从命令行访问Llama 2

    使用LLM插件从命令行访问Llama 2

    最近的一个大新闻是Meta AI推出了新的开源授权的大型语言模型Llama 2。这是一项非常重要的进展:Llama 2可免费用于研究和商业用途。(几小时前,swyy发现它已从LLaMA 2更名为Lla
  • 破圈是B站头上的紧箍咒

    破圈是B站头上的紧箍咒

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之每年的暑期档都少不了瞄准追剧女孩们的古偶剧集,2021年有优酷的《山河令》,2022年有爱奇艺的《苍兰诀》,今年却轮到小破站抓住了追
  • 三星显示已开始为AR设备研发硅基LED微显示屏

    三星显示已开始为AR设备研发硅基LED微显示屏

    7月18日消息,据外媒报道,随着苹果首款头显产品Vision Pro在6月份正式推出,AR/VR/MR等头显产品也就将成为各大公司下一个重要的竞争领域,对显示屏这一关
  • 3699元!iQOO Neo8 Pro顶配版今日首销:1TB UFS 4.0同价位唯一

    3699元!iQOO Neo8 Pro顶配版今日首销:1TB UFS 4.0同价位唯一

    5月23日,iQOO推出了全新的iQOO Neo8系列,包含iQOO Neo8和iQOO Neo8 Pro两个版本,其中标准版搭载高通骁龙8+,而Pro版更是首发搭载了联发科天玑9200+旗舰
  • iQOO Neo8系列新品发布会

    iQOO Neo8系列新品发布会

    旗舰双芯 更强更Pro
Top